• 微信号
  • 微信号
您当前的位置:首页 > 学海无涯 > 茑语花香>C++ 结构体&指针

C++ 结构体&指针

孤峰 孤峰家 2023-09-22 119人阅读

今天来学习结构体和指针水一波,结构体和指针都是 C++ 的基础部分,当然,它不是一种算法

结构体

定义

结构体大致可以理解为一个包含了多种变量的新变量形式,定义结构体的方式如下

struct 结构体名
{
 变量类型 变量;
 变量类型 变量;
 ...
}变量;
或
结构体名 变量;

结构体就相当于你自己定义的一种变量类型,而结构体名就是变量类型的提示符,即

struct node1
{
 string name;
 float height,weight;
}a;
struct node2
{
 string name;
 float height,weight;
};
node1 b;
node2 c;

当然这两种定义的方式都是可以的,值得注意的是,它与定义变量时的要求一样,不能使用保留字,不能重复定义,不能重复使用相同的变量名

struct node

声明需要定义一个结构体类型的变量类型,名为 node

{
 int a,b;//可以是整型
 string c,d;//可以是字符串
 float e,f;//可以是单精浮点数
 double g,h;//可以是双精浮点数
 char i,j;//可以是字符
 bool k,l;//也可以使bool变量
 int m(int n)//还可以是函数
 {
return n*2;
 }
 bool o(bool p,bool q)//函数也可以有不同的类型
 {
return (!p||q)&&(p||!q);
 }
 struct nodeX//还可以套结构体
 {
int a,b;//不同的结构体中可以使用相同的变量名
short c,d;
long long e,f;
 }r;
 int s[10];//还可以定义数组
 char t[10];//不同类型的数组
 int u[10][10];//还可以是二维数组
 bool v[10][10];//还可以是不同类型的二维数组
 int w[3][3][3];//亦或是三维数组
 int *x;//当然接下来学习的指针也是可以的
 enum y{A=1,B,C,D,E,F,G};//或者奇奇怪怪的类型
 class z//或者是再套一个类
 {
public:
int a(int a,int b)
{
 return a-b;
}
private:
int b(int a,int b)
{
 return b-a;
}
 };
};
//勉强凑齐a~z...

结构体里面可以定义非常多的东西,结构体中的各种东西都仍然需要占用一定的空间,并不是用了结构体就能减少空间的利用,它只是帮助我们方便地更改一个对象的值

使用

当需要访问某个结构体的内部变量,一般这样引用 ( node 为上面的 )

node a;
a.a;//访问a中的int类型变量a
a.c;//访问a中的string类型变量c
a.s[1];//访问a中的int类型数组s的第一项
a.o(true,false);//使用a中的bool类型的函数o
//或者
node a;
node* b=&a;//这就是指针,当然可以先不用理解
b->a;
b->c;
b->s[1];
b->o(true,false);
//所以
//使用"."的时候,左边一定是变量本身
//使用"->"的时候,左边一定是指向变量的指针
结构体变量名.成员名 指向该结构体的指针->该结构体的成员

这样形式的变量就相当于普通的变量了,与普通的变量使用方式相同

其他

node a[10]; node a[10][10];

你知道吗

这样的代码会编译错误

#include<iostream>
#include<cstdio>
using namespace std;
struct node
{
 int a;
 struct node b;
}a;
int **in()
{
}

可是,当加上 * 号后不会了

#include<iostream>
#include<cstdio>
using namespace std;
struct node
{
 int a;
 struct node *b;
}a;
int **in()
{
}

为什么呢,接下来就来看看什么是指针

指针

指针也是一种变量类型,大家都知道,每个变量都需要被存储 ( 废话 ),只有计算机知道这个变量存在哪里,所以如果要知道这个变量存在哪里怎么办?( 虽然知道存在哪里也没什么用 )

这时候就要用到指针了,指针就像一个指针,它总会指向某个变量,即保存着这个变量的地址

而地址嘛...

4878384
2293292
2293288
2293284

是一些奇奇怪怪的数,反正我们是看不懂的

可是指针的作用可不小

定义

一个指针变量应该这样声明,这里的指针符号 * 就是用来声明指针的

int a;//定义了一个变量a
int *b=NULL;//定义了一个指针变量b
int *b;

如果什么都没有填,也不会指向某个变量

值得注意的是,定义指针变量不会真的创建一个相应类型的变量,而是创建一个相应类型的指针变量,这就是为什么在结构体中允许定义指向自身变量的指针了

int *b=&a; scanf("%d",&a);

scanf 函数中的 & 也是取地址符,所以,使用 scanf 时传入函数的是地址,而不是变量 a 的值

int a; int *b=&a; //这是对的 int a; char *b=&a; //这是错的

使用

知道了取地址符,也要知道解引用符,即 * ,这时有人就要问了

这个本来不是乘法吗,变成指针我已经忍了,怎么又变成别的了?

当它用在两侧都有变量的时候,它就是乘法符号

当它用在定义一个指针变量的时候,它就是指针符号

当它用在指针变量前时,它就是解引用符号

string a="SanLian";//定义一个变量a
string *b=&a;//定义一个指针变量指向a
string c=*b;//将指针变量b指向的空间重新变成变量传给c
//这时变量c就为"SanLian"了
c="SanLian"

这时 * 就像是一个解读器,把 b 所指向的地址中的内容转变为变量传给 c

其他

数组的名字可以看做是该数组的指针,并且在定义数组时,程序都会申请一块连续的空间,所以,访问数组时可以这样做

int i,n,a[10000];
scanf("%d",&n);
for(i=1;i<=n;++i) scanf("%d",a+i);

指针就先讲到这里,其实指针还有很多的功能

转载:感谢您阅览,转载请注明文章出处“来源从小爱孤峰知识网:一个分享知识和生活随笔记录的知识小站”。

链接:C++ 结构体&指针http://www.gufeng7.com/niaolang/1857.html

联系:如果侵犯了你的权益请来信告知我们删除。邮箱:119882116@qq.com

标签: 结构体 指针