指针的练习(1)

一、指针的简单分析

总结:

1只有在俩种情况下arr代表数组地址,其他情况表示数组首元素地址。如下:

sizeof(arr),这里的arr不是数组地址,是数组的地址

&arr,表示数组地址。

2..地址的大小只可能是4/8,它与指针类型无关,只与平台是32位有关。

3.sizeof()可以说是一个操作符,他的使用至于类型有关,与内存大小无关

4.strlen()的使用是需要地址,并且它遇到‘\0’才停止,

5.二维数组相当于每有一行但是一个一维数组

//一维数组

int a[] = {1,2,3,4};

printf("%d\n",sizeof(a));16,这里的arr如上述,表示数组地址。

printf("%d\n",sizeof(a+0));4,与上述俩种情况不一致,那就代表不是数组地址,a是首元素地址+0,不变,依旧是数组首元素地址。

printf("%d\n",sizeof(*a));4,a是数组首元素地址,而*a是解引用后的首元素值 1 ,是int类型所以大小是4.

printf("%d\n",sizeof(a+1));a表示首元素地址,对于指针加一就是数组的第二个元素,int类型大小依旧是4

printf("%d\n",sizeof(a[1]));a[1],数组的第二个元素,int类型所以是4.

printf("%d\n",sizeof(&a));取地址a,那就是a的地址所以是指针,大小是4/8

printf("%d\n",sizeof(*&a));先取地址a,然后解引用,括号内容不变依旧是a,所以16

printf("%d\n",sizeof(&a+1));取地址a,然后+1,相当于往后移动了一个数组的大小,但它依旧是指针,所以4/8

printf("%d\n",sizeof(&a[0]));a[0]是数组的第一个元素,对它取地址,那就是指针,所以4/8

printf("%d\n",sizeof(&a[0]+1));如上,&a[0]是一个指针,那指针+1,依旧是指针

//字符数组

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

printf("%d\n", sizeof(arr));arr在这里是数组的地址,所以是5

printf("%d\n", sizeof(arr+0));在这arr+0表示数组的首元素地址,是指针所以就是4/8

printf("%d\n", sizeof(*arr));*arr是解引用数组的首元素地址,所以1

printf("%d\n", sizeof(arr[1]));arr[1],是数组的第二的元素,所以1

printf("%d\n", sizeof(&arr));&arr表示的数组的地址,那就是指针,4/8

printf("%d\n", sizeof(&arr+1));&arr+1依旧是地址,指针大小只可能是4/8

printf("%d\n", sizeof(&arr[0]+1));&arr[0]+1,是取出首元素的地址+1,那就是数组第二个元素的地址,4/8

printf("%d\n", strlen(arr));,strlen与内存大小有关,arr是单个的字符并非字符串,它的末尾没有‘/0’,所以是随即值

printf("%d\n", strlen(arr+0));arr+0依旧首元素地址,没有‘/0,是随即值

printf("%d\n", strlen(*arr));*arr就是首元素的值‘a’,a不是地址,错误

printf("%d\n", strlen(arr[1]));同上,错误

printf("%d\n", strlen(&arr));随即值

printf("%d\n", strlen(&arr+1));随即值

printf("%d\n", strlen(&arr[0]+1));它表示数组的第二个元素,相比 strlen(arr)它要小1,无关的知识

char arr[] = "abcdef";

printf("%d\n", sizeof(arr));"abcdef"是常量字符串,他的末尾存在‘/0’,所以他的大小是7

printf("%d\n", sizeof(arr+0));地址+0,它依旧是首元素的地址,所以4/8

printf("%d\n", sizeof(*arr));*arr相当于a,所以它是1

printf("%d\n", sizeof(arr[1]));同上arr[1] 就是吧,依旧是1

printf("%d\n", sizeof(&arr));&arr的地址那就是指针,指针只能是4/8

printf("%d\n", sizeof(&arr+1));&arr+1相当与跳过了一个数组的地址,那还是指针,4/8

printf("%d\n", sizeof(&arr[0]+1));依旧是地址,4/8

printf("%d\n", strlen(arr));由总结可知,trlen()的使用是需要地址,并且它遇到‘\0’才停止,所以是6

printf("%d\n", strlen(arr+0));arr+0依旧是arr的首元素地址,从他开始往后计算字符串长度,6

printf("%d\n", strlen(*arr));它需要的是地址,*arr是a,传入了一个字符,所以错误

printf("%d\n", strlen(arr[1]));同上

printf("%d\n", strlen(&arr));&arr虽然是数组地址,但是它依旧从数组首元素出发,所以是6

printf("%d\n", strlen(&arr+1));&arr+1相当于跳过了一个数组,连带‘\0’一起的跳过,所以随机值

printf("%d\n", strlen(&arr[0]+1));(&arr[0]+1)就是数组的第二个元素,从他开始,到\0,大小是5

char *p = "abcdef";

printf("%d\n", sizeof(p));p是char*指针,指针的大小只能是4/8

printf("%d\n", sizeof(p+1));指针+1依旧是指针,所以大小是4/8

printf("%d\n", sizeof(*p));*p就是a,所以一个字符,大小是1

printf("%d\n", sizeof(p[0]));同上个

printf("%d\n", sizeof(&p));p本身就是指针,那么&p就是二级指针,那么还是4/8

printf("%d\n", sizeof(&p+1));指针+1还是指针,4/8

printf("%d\n", sizeof(&p[0]+1));首元素的地址+1,是数组第二个元素的地址,4/8

printf("%d\n", strlen(p));它遇到\0就停止,所以是6

printf("%d\n", strlen(p+1));p相当于指向a的地址的指针,p+1就是b的地址,从b开始到\0那么。就是5

printf("%d\n", strlen(*p));出错

printf("%d\n", strlen(p[0]));出错

printf("%d\n", strlen(&p));随机值

printf("%d\n", strlen(&p+1))随机值;

printf("%d\n", strlen(&p[0]+1))就是b的地址,从b开始到\0那么。就是5

//二维数组

int a[3][4] = {0};

printf("%d\n",sizeof(a));它相当于遍历一边数组,大小是48

printf("%d\n",sizeof(a[0][0]));数组的首元素,所以是4

printf("%d\n",sizeof(a[0]));它相当于数组的第一行元素,所以大小是16

printf("%d\n",sizeof(a[0]+1));它相当于数组的第二行元素,所以大小是16

printf("%d\n",sizeof(*(a[0]+1)));a[0]+14它相当于数组的第二行元素,但是它指向数组的第二行元素的第一个元素,所以大小是4

printf("%d\n",sizeof(a+1));指针的大小4/8

printf("%d\n",sizeof(*(a+1)));16

printf("%d\n",sizeof(&a[0]+1));它是一个指针4/8

printf("%d\n",sizeof(*(&a[0]+1)));16

printf("%d\n",sizeof(*a));a就是数组的第一行元素,所以16

printf("%d\n",sizeof(a[3]));sizeof至于类型相关,它可以直接类比出a[3]的大小与a一致,16

如果大家发现错误,请及时联系我,或者直接评论留言

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山山人行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值