C语言指针与数组

一、C语言中数组名的意义:

1.sizeof(数组名)。数组名代表整个数组,函数计算的是整个数组的大小。

2.&数组名。取数组地址表示整个数组,取出的是整个数组的地址。

3.除此之外所有的数组名都表示数组首元素的地址。

二、指针和数组解析

1.一维数组

//一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
//此处仅有地址名,即代表整个数组,则输出的是整个数组的大小,为16

printf("%d\n",sizeof(a+0));
//此处a+0,代表数组首元素地址,地址在32位平台输出4,64位平台输出8

printf("%d\n",sizeof(*a));
//*a代表着取a数组首元素地址,然后进行解引用,取得1,int为4个字节,输出4

printf("%d\n",sizeof(a+1));
//a+1和上面的a+0同理,不同的是a+1后,取得的是2的地址,地址在32位平台输出4,64位平台输出8

printf("%d\n",sizeof(a[1]));
//a[1]计算的是数组第二个元素的大小,输出4

printf("%d\n",sizeof(&a));
//&a为取整个数组的地址,在32位平台输出4,64位平台输出8

printf("%d\n",sizeof(*&a));
//这里先是对a取整个数组的地址,然后*号进行解引用,计算整个数组的大小,输出16

printf("%d\n",sizeof(&a+1));
//在上面我们已经知道了&a为取整个数组的地址,+1后指针到了a数组的后面,取得a数组后面的地址,地址在32位平台输出4,64位平台输出8

printf("%d\n",sizeof(&a[0]));
//a[0]为数组首元素,&a[0]则为取地址首元素的地址,则地址在32位平台输出4,64位平台输出8

printf("%d\n",sizeof(&a[0]+1));
//与上一题同理,a[0]+1获取数组第二位,然后进行取地址,地址在32位平台输出4,64位平台输出8

2.字符数组

字符数组
char arr[] = { 'a','b','c','d','e','f' };

printf("%d\n", sizeof(arr));
//数组名代表整个数组,char类型每个元素一个字节,输出6

printf("%d\n", sizeof(arr + 0));
//arr+0为取数组首元素地址,内存地址在32位平台输出4,64位输出8

printf("%d\n", sizeof(*arr));
//*arr为取数组首位地址,然后进行解引用,得a,char类型元素大小为1字节,输出1

printf("%d\n", sizeof(arr[1]));
//arr[1]为数组首元素a,a为char类型,大小为1,输出1

printf("%d\n", sizeof(&arr));
//&arr为取数组首元素地址,内存地址在32位平台输出4,64位输出8

printf("%d\n", sizeof(&arr + 1));
//arr+1,为数组元素b,然后取地址,内存地址在32位平台输出4,64位输出8

printf("%d\n", sizeof(&arr[0] + 1));
//与上一题同理

//计算字符串长度
printf("%d\n", strlen(arr));
//arr表示整个数组,strlen遇到/0后会停止计算,但因为strlen未在数组中检查到\0,则输出随机值

printf("%d\n", strlen(arr + 0));
//arr+0为取首元素地址,strlen在运算过程中,不确定何时会遇到\0,则输出随机值

printf("%d\n", strlen(*arr));
//取数组首元素地址,然后进行解引用,a的ascii码为97,strlen获取到错误地址,则报错

printf("%d\n", strlen(arr[1]));
//此题与上题同理,同样获取到错误地址,报错

printf("%d\n", strlen(&arr));
//&arr为取整个数组的地址,strlen对整个数组的地址进行计算,得出随机值

printf("%d\n", strlen(&arr + 1));
//此题与上题类似,取元素b的地址,同样是输出随机值

printf("%d\n", strlen(&arr[0] + 1));
//此题同样输出随机值


char arr[] = "abcdef";

printf("%d\n", sizeof(arr));
//arr表示整个数组,sizeof计算数组大小,数组内包含\0,输出7

printf("%d\n", sizeof(arr + 0));
//arr+0,表示数组首元素地址,内存地址在32平台输出4,64位平台输出8

printf("%d\n", sizeof(*arr));
//取首元素地址,然后对其进行解引用,得元素a,char一个元素大小位1字节,输出1

printf("%d\n", sizeof(arr[1]));
//arr[0]为数组首位元素,则输出1

printf("%d\n", sizeof(&arr));
//取arr数组地址,内存地址在32平台输出4,64位平台输出8

printf("%d\n", sizeof(&arr + 1));
//此处取的是arr数组后的地址,内存地址在32平台输出4,64位平台输出8

printf("%d\n", sizeof(&arr[0] + 1));
//此处取数组第二位元素地址,内存地址在32平台输出4,64位平台输出8

printf("%d\n", strlen(arr));
//strlen为计算字符串长度,此数组存在\0,输出6

printf("%d\n", strlen(arr + 0));
//取数组首元素地址,然后对数组长度进行计算,输出6

printf("%d\n", strlen(*arr));
//取地址,解引用得a,strlen获取到错误地址,结果为错误

printf("%d\n", strlen(arr[1]));
//与上题结果一样,错误

printf("%d\n", strlen(&arr));
//取整个数组地址,然后进行计算,输出6

printf("%d\n", strlen(&arr + 1));
//取arr数组地址,然后+1获取arr后面地址,计算结果为随机值

printf("%d\n", strlen(&arr[0] + 1));
//arr[0]+1为b,取地址后进行计算,输出5

3.数组指针

char* p = "abcdef";

printf("%d\n", sizeof(p));
//此处p为数组地址,内存地址在32位平台输出4,64位平台输出8

printf("%d\n", sizeof(p + 1));
//p+1后取数组后面地址,内存地址在32位平台输出4,64位平台输出8

printf("%d\n", sizeof(*p));
//*p为地址解引用,得a,计算长度为1

printf("%d\n", sizeof(p[0]));
//p[0]可以等价为*(p+0),则为a,计算a的大小为1

printf("%d\n", sizeof(&p));
//取*p指针的地址,内存地址在32位平台输出4,64位平台输出8

printf("%d\n", sizeof(&p + 1));
//取*p指针后面的地址,内存地址在32位平台输出4,64位平台输出8

printf("%d\n", sizeof(&p[0] + 1));
//p[0] + 1为元素b,然后取地址,内存地址在32位平台输出4,64位平台输出8

printf("%d\n", strlen(p));
//p为数组首元素地址,然后计算数组长度,输出6

printf("%d\n", strlen(p + 1));
//p+1取得数组第二位元素地址,然后计算数组长度,输出5

printf("%d\n", strlen(*p));
//解引用后strlen接收到a,strlen计算错误

printf("%d\n", strlen(p[0]));
//同上一题,报错

printf("%d\n", strlen(&p));
//取*p地址,然后计算*p长度,输出随机值

printf("%d\n", strlen(&p + 1));
//同上一题

printf("%d\n", strlen(&p[0] + 1));
//p[0] + 1 为b,然后取地址,计算长度,输出5

4.二维数组

二维数组
int a[3][4] = { 0 };

printf("%d\n", sizeof(a));
//a数组名表示整个数组,int类型一个元素4个字节,输出48

printf("%d\n", sizeof(a[0][0]));
//a[0][0]为数组第一行第一个元素,输出4

printf("%d\n", sizeof(a[0]));
//a[0]为二维数组第一行,第一行长度为14.输出16

printf("%d\n", sizeof(a[0] + 1));
//a[0]+1为第一行,第二个元素的地址,则内存地址在32位平台输出4,64位平台输出8

printf("%d\n", sizeof(*(a[0] + 1)));
//a[0]+1为第一行,第二个元素的地址,解引用为第一行第二个元素,计算元素大小,输出4

printf("%d\n", sizeof(a + 1));
//此为第二行地址,则内存地址在32位平台输出4,64位平台输出8

printf("%d\n", sizeof(*(a + 1)));
//解引用为第二行,所以计算的是第二行的大小,输出16

printf("%d\n", sizeof(&a[0] + 1));
//取第二行地址,内存地址在32位平台输出4,64位平台输出8

printf("%d\n", sizeof(*(&a[0] + 1)));
//取地址,解引用后为第二行大小,然后计算为16

printf("%d\n", sizeof(*a));
//a为首元素地址,解引用后,为第一行,则计算第一行大小,输出16

printf("%d\n", sizeof(a[3]));
//a[3],为第四行的数组名,计算的是第四行的大小,第四行不存在,但仍然可以进行计算大小

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值