详解:指针和数组的相关运算题

一、知识点

        数组名代表整个数组的时候只有两种情况:

  • sizeof(数组名)
  • &数组名

二、相关运算题

1. 整形数组

int a[] = { 1, 2, 3, 4 }; 
printf("%d\n", sizeof(a));            //a表示整个数组,计算的是整个数组的字节大小---16
printf("%d\n", sizeof(a + 0));        //a+0表示数组首元素的地址---4
printf("%d\n", sizeof(*a));           //*a <=> *(a+0) <=> a[0],表示数组首元素(int)---4
printf("%d\n", sizeof(a + 1));        //a+1表示数组第二个元素的地址---4
printf("%d\n", sizeof(a[1]));         //a[1]表示数组第二个元素(int)---4
printf("%d\n", sizeof(&a));           //&a表示整个数组的地址---4
printf("%d\n", sizeof(*&a));          //*&a表示整个数组,计算的是整个数组的字节大小---16
printf("%d\n", sizeof(&a + 1));       //&a表示整个数组的地址,&a+1表示跳过整个数组,整个数组后面那块空间的起始地址---4
printf("%d\n", sizeof(&a[0]));        //&a[0]表示数组首元素的地址---4
printf("%d\n", sizeof(&a[0] + 1));    //&a[0]+1表示数组第二个元素的地址---4

2. 字符数组

char arr[] = {'a','b','c','d','e','f'}; 
printf("%d\n", sizeof(arr));          //arr表示整个数组,计算的是整个数组的字节大小---6
printf("%d\n", sizeof(arr+0));        //arr+0表示数组首元素的地址---4
printf("%d\n", sizeof(*arr));         //*arr表示首元素(char)---1
printf("%d\n", sizeof(arr[1]));       //arr[1]表示数组第二个元素(char)---1
printf("%d\n", sizeof(&arr));         //&arr表示整个数组的地址---4
printf("%d\n", sizeof(&arr+1));       //&arr表示整个数组的地址,&arr+1表示跳过整个数组,整个数组后面那块空间的起始地址---4
printf("%d\n", sizeof(&arr[0]+1));    //&arr[0]+1表示数组第二个元素的地址---4

printf("%d\n", strlen(arr));          //从'a'开始数,'f'的后面未知---随机值
printf("%d\n", strlen(arr + 0));      //从'a'开始数,'f'的后面未知---随机值
printf("%d\n", strlen(*arr));         //*arr表示首元素('a'--97),97这个地址不允许访问---error
printf("%d\n", strlen(arr[1]));       //arr[1]表示数组第二个元素('b'--98),98这个地址不允许访问---error
printf("%d\n", strlen(&arr));         //从'a'开始数,'f'的后面未知---随机值
printf("%d\n", strlen(&arr + 1));     //跳过整个数组,从'f'后开始数,'f'的后面未知---随机值,与上面差6
printf("%d\n", strlen(&arr[0] + 1));  //从'b'开始数,'f'的后面未知---随机值,与上上面差1

3. 字符串数组

char arr[] = "abcdef"; 
printf("%d\n", sizeof(arr));          //arr表示整个数组,计算的是整个数组的字节大小,其中该数组包含'\0'---7
printf("%d\n", sizeof(arr + 0));      //arr+0表示数组首元素的地址---4
printf("%d\n", sizeof(*arr));         //*arr表示首元素(char)---1
printf("%d\n", sizeof(arr[1]));       //arr[1]表示数组第二个元素(char)---1
printf("%d\n", sizeof(&arr));         //&arr表示整个数组的地址---4
printf("%d\n", sizeof(&arr + 1));     //跳过整个数组,整个数组后面(即'\0'后面)那块空间的起始地址---4
printf("%d\n", sizeof(&arr[0] + 1));  //&arr[0]+1表示数组第二个元素的地址---4

printf("%d\n", strlen(arr));          //从'a'开始数,'f'的后面遇见'\0'---6
printf("%d\n", strlen(arr + 0));      //从'a'开始数,'f'的后面遇见'\0'---6
printf("%d\n", strlen(*arr));         //*arr表示首元素('a'--97),97这个地址不允许访问---error
printf("%d\n", strlen(arr[1]));       //arr[1]表示数组第二个元素('b'--98),98这个地址不允许访问---error
printf("%d\n", strlen(&arr));         //从'a'开始数,'f'的后面遇见'\0'---6
printf("%d\n", strlen(&arr + 1));     //跳过整个数组,从'\0'后开始数,'\0'的后面未知---随机值
printf("%d\n", strlen(&arr[0] + 1));  //从'b'开始数,'f'的后面遇见'\0'---5

4. 字符串指针

char *p = "abcdef"; 
printf("%d\n", sizeof(p));            //p是一个指针变量,为一个地址---4
printf("%d\n", sizeof(p + 1));        //p+1是'b'的地址---4
printf("%d\n", sizeof(*p));           //p是一个字符指针,解引用后就是一个字符---1
printf("%d\n", sizeof(p[0]));         //p[0] <=> *(p+0) <=> *p ---1
printf("%d\n", sizeof(&p));           //&p是p的地址---4
printf("%d\n", sizeof(&p + 1));       //跳过p,p后面那段空间的起始地址---4
printf("%d\n", sizeof(&p[0] + 1));    //&p[0]+1是'b'的地址---4

printf("%d\n", strlen(p));            //从'a'开始数,'f'的后面遇见'\0'---6
printf("%d\n", strlen(p + 1));        //从'b'开始数,'f'的后面遇见'\0'---5
printf("%d\n", strlen(*p));           //*p表示字符'a'('a'--97),97这个地址不允许访问---error
printf("%d\n", strlen(p[0]));         //p[0]表示字符'a'('a'--97),97这个地址不允许访问---error
printf("%d\n", strlen(&p));           //&p是p的地址,该地址上存储的内容是字符串“abcdef”的首地址,将这个地址值转换成一个个字符开始往后数,直到遇见'\0'---随机值
printf("%d\n", strlen(&p + 1));       //&p+1是p后面那段空间的起始地址,该地址上存储的内容是未知的---随机值
printf("%d\n", strlen(&p[0] + 1));    //从'b'开始数,'f'的后面遇见'\0'---5

5. 二维整形数组

int a[3][4] = {0};
printf("%d\n", sizeof(a));            //a表示整个数组,计算的是整个数组的字节大小---48
printf("%d\n", sizeof(a[0][0]));      //a[0][0]表示整个数组的第一个元素(int)---4
printf("%d\n", sizeof(a[0]));         //a[0]是二维数组首元素(有4个元素的一维数组)的数组名,表示整个一维数组,计算的是整个一维数组的字节大小---16
printf("%d\n", sizeof(a[0] + 1));     //这里的a[0]表示a[0][0]的地址,则a[0]+1表示a[0][1]的地址---4
printf("%d\n", sizeof(a + 1));        //这里的a是二维数组首元素(有4个元素的一维数组)的地址,即一维数组a[0]的地址,则a+1是下一个一维数组的地址(a[1]的地址)---4
printf("%d\n", sizeof(&a[0] + 1));    //&a[0]是二维数组首元素(有4个元素的一维数组)的地址,即一维数组a[0]的地址,则&a[0]+1是下一个一维数组的地址(a[1]的地址)---4
printf("%d\n", sizeof(*a));           //*a <=> *(a+0) <=> a[0],是二维数组首元素(有4个元素的一维数组)的数组名,表示整个一维数组,计算的是整个一维数组的字节大小---16
printf("%d\n", sizeof(a[3]));         //不用访问,由类型(一维数组)可得---16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值