memset 结构体内指针_为什么我们C++编程需要使用指针?

这是C/C++的内存指针系列第一篇文章。

  1. 内存下面这图片是内存条,我们写的程序和程序运行的数据都存储在这里面。
df97ce4e034bbb41e48afa03a9df9da5.png

刚学C语言时候,使用scanf()函数进行输入,printf()函数进行输出。同样是操作一个变量,scanf()的用法是scanf(“格式串”,&变量集),而printf函数则不用&符号,可以直接调用一个变量

指针可以帮我们调度内存,而scanf()函数就是指针的一个应用。函数知道变量名,但实际的操作并不是把一个值传递给变量名,而是传递给变量名对应的地址。

比如我有一个整型变量x,x对应的地址是0f304499,那么scanf(“%d”,&x)就是把输入的一个值存储到x对应的内存0f304499的位置。因为int类型占用内存空间不止一个字节,所以这个内存只是一段连续空间的开始。

具体可以使用sizeof(int)得到当前操作系统/编译器下int应该占用的内存空间大小。

2. 指针的定义和赋值

对于一个整型变量的指针,可以这样定义

int *p;

一个字符型变量,也可以定义为

char *ch;

然后可以用p=&x;对指针赋值,将指针指向x的内存空间。

3. 元素并行指针

3.1 一维数组

一维数组的内存空间研究

对于一维数组,既往知识为,int xxx[]即从空闲的内存空间中申请一大块连续的空间。举个例子,我写了下面这段代码:

inta4test[30];

for (int i = 0; i <30; i++)std::cout << &a4test[30];

std::cout <

std::cout<

同时,我们用sizeof获取每一个int类型变量在这个编译器环境下的占用的内存空间,也获取这个数组所占用的所有空间。借助前面对这个数组每一个元素地址的遍历验证。

结果出乎意料,返回的结果是

30个00DCFA84 120 4

确实,我们可以得出一个结论,对这个数组任何一个变量单独求地址空间,得到的答案都是同一个内存空间。由于我们不知道这个内存空间指向哪一个元素,所以这里继续编程测试。

我接下来定义一个指针变量int *p=&a4test[0];然后输出p指向地址的int值。输出0 。

那么怎么指向第二个,第三个元素?

需要a4point +1 来表示。

int* pr =a4test+2;

std::cout<< *(pr+3) ;

以上代码片段中提到的两种方法均可。

3.2 二维数组

为了探究二维数组a[i][j]中每一个变量在内存的空间,这里进行编程实验。

for (int i = 0; i < 10; i++)std::cout << &Mi[1][i]<

std::cout << std::endl;

for (int i = 0; i <10; i++)std::cout << &Mi[1] <

输出结果如下

00B0F8F8 00B0F8FC 00B0F900 00B0F90400B0F908 00B0F90C 00B0F910 00B0F914 00B0F918 00B0F91C

00B0F8F8 00B0F8F8 00B0F8F8 00B0F8F800B0F8F8 00B0F8F8 00B0F8F8 00B0F8F8 00B0F8F8 00B0F8F8

由此可见,二维数组中,把第一维度看作一个数组,然后第一维度每个数组再申请数组空间,得到我们所看到的空间结构。

由此我们推测,三维数组的内存空间申请也是如此,先把第一维每一个变量看成一个二维数组,再递归下去申请空间。

N维数组也是一样,推测空间申请也是n维即申请n-1个n-1维,到申请一个一维。

3.3 结构体

设一个结构体,然后输出内存地址。

structnode {

int x;

int y;

int z;

}Vtx[10];

for (int i = 0; i< 10; i++) {

std::cout<< &Vtx[i].x <

<< &Vtx[i].y <

<< &Vtx[i].z << std::endl;

}

然后得到如下输出

00FBFA80 00FBFA84 00FBFA88

00FBFA8C 00FBFA90 00FBFA94

00FBFA98 00FBFA9C 00FBFAA0

00FBFAA4 00FBFAA8 00FBFAAC

00FBFAB0 00FBFAB4 00FBFAB8

00FBFABC 00FBFAC0 00FBFAC4

00FBFAC8 00FBFACC 00FBFAD0

00FBFAD4 00FBFAD8 00FBFADC

00FBFAE0 00FBFAE4 00FBFAE8

00FBFAEC 00FBFAF0 00FBFAF4

由此可见,结构体类似于一个多维数组。这里只有结构体的一个维度和结构体内所含有的变量,这里等价一个二维数组。而且,其中规律和二维数组一致。

长按识别关注,一起交流技术

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值