指向数组名的指针加1和二维数组首地址相加1,以及二维数组里的一维数组首地址加1的理解。
因为后面要写C语言相关的题,挺久没有学习C语言了,发现对指针的感念变得很模糊,当初学指针的时候,觉得有些懵懵的感觉,所以现在重新缕一缕概念,相信有不少同学刚刚开始接触指针的时候多少会有点疑惑,所以我就跟大伙分享一下我的简单复习,写完以后,我觉得挺清楚的,希望对大家有所帮助吧。
下面是我举了一个简单的指针和二维数组的例子。
// 复习一下指针内容
//下面的指向即为存储
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
int *p=a; // *表明p是指针 将a赋值给p
p += 6;
printf("&a %d\n", &a);
// 6487520 自己存自己的地址 他的值,即为它指向的地址 也就是他本身的地址
printf("*a %d\n", *a); // 6487520 *a和 a[0]指向同一个地址
printf("**a %d\n ", **a); // 0 *a和 a[0]指向同一个地址 **a就是这个地址的值
printf("*a[0] %d\n", *a[0]); // 0 *a[0]也是*a的这个地址的值 即**a
printf("a[0][0] %d\n", a[0][0]); // 0 &a[0][0]即*a的这个地址 即a[0][0]=**a
printf("*p %d\n", *p); // 6 p指向a的值 即a[0] 所以p+=6 即a[0]+6 所以*p=*(a[0]+6)
printf("*(a[0]+6) %d\n", *(a[0]+6)); // 6
printf("a+6 %d\n", a+6); // 6487616 比 6487520 多了 96个字节
/* 地址相加,int地址之间隔4个字节,但他是二维数组的首地址 同时也是三个一维数组的首地址,
他加的时候是一行一行的加的,也就是由第一个一维数组的首地址加到第二个一维数组的首地址,
一维数组有4个元素,他加1相当于加一下子加了4个相邻地址之间的字节,1个相邻地址之间的字节为
4,4个相邻地址之间的字节为即为16,即加1相当于加了16个字节,加6相当于加了96个字节*/
printf("a[0]+6 %d\n", a[0]+6);
/* 6487544 比 6487520 多了24 a[0]是二维数组中一维数组的首地址,所以他是相邻地址之间的相加,
加6即加了24个字节*/
printf("p %d\n", p); // 6487544 p指向a的值 即a[0] 所以p+=6 即a[0]+6
printf("*(&a[0][0]+6) %d", *(&a[0][0]+6));
// 6 &a[0][0]同样是相邻地址之间的相加,6即是储存在 地址相加后得到的地址中
return 0;
}
如果有概念理解错误,还请小伙伴们指明,我会及时更正的,一起学习吧!