指针与数组

指针进阶

//一维数组
int a[] = {1,2,3,4};
	//一维数组
	int a[] = { 1, 2, 3, 4 };
	printf("%d\n", sizeof(a));//数组名单独存在时代表整个数组,16
	printf("%d\n", sizeof(a + 0));//第一个元素地址的大小,4
	printf("%d\n", sizeof(*a));//第一个元素的大小,4
	printf("%d\n", sizeof(a + 1));//第二个元素的地址,4
	printf("%d\n", sizeof(a[1]));//第二个元素,4
	printf("%d\n", sizeof(&a));//数组的地址,4
	printf("%d\n", sizeof(*&a));//数组的地址再解引用代表整个数组,16
	printf("%d\n", sizeof(&a + 1));//下一个数组的地址,4
	printf("%d\n", sizeof(&a[0]));//第一个元素的地址,4
	printf("%d\n", sizeof(&a[0] + 1));//第二个元素的地址,4
//字符数组
char arr[] = {'a','b','c','d','e','f'};
	printf("%d\n", sizeof(arr));//数组名单独存在代表整个数组,6
	printf("%d\n", sizeof(arr + 0));//第一个元素的地址,4
	printf("%d\n", sizeof(*arr));//第一个元素,1
	printf("%d\n", sizeof(arr[1]));//第一个元素,1
	printf("%d\n", sizeof(&arr));//数组的地址,4
	printf("%d\n", sizeof(&arr + 1));//指向下一个数组的地址,4
	printf("%d\n", sizeof(&arr[0] + 1));//第二个元素的地址,4
	//size_t strlen(const char *string);strlen的参数为const char *string
	printf("%d\n", strlen(arr));//随机数,len
	printf("%d\n", strlen(arr + 0));//随机数,len
	printf("%d\n", strlen(*arr));//char,参数类型不匹配
	printf("%d\n", strlen(arr[1]));//char,参数类型不匹配
	printf("%d\n", strlen(&arr));//char(*)[6],,在不同的编译器下警告或者报错,随机数,len
	printf("%d\n", strlen(&arr + 1));//char(*)[6],在不同的编译器下警告或者报错,随机数
	printf("%d\n", strlen(&arr[0] + 1));//随机数,;len-1
	char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));//数组名单独存在代表整个数组,使用""初始化时后面会加'\0',7
	printf("%d\n", sizeof(arr + 0));//第一个元素的地址,4
	printf("%d\n", sizeof(*arr));//第一个元素,1
	printf("%d\n", sizeof(arr[1]));//第一个元素,1
	printf("%d\n", sizeof(&arr));//数组的地址,4
	printf("%d\n", sizeof(&arr + 1));//下一个数组的地址,4
	printf("%d\n", sizeof(&arr[0] + 1));//第二个元素的地址,4
	printf("%d\n", strlen(arr));//字符串的长度,不包含'\0',6
	printf("%d\n", strlen(arr + 0));//字符串的长度,不包含'\0',6
	printf("%d\n", strlen(*arr));//类型不匹配 
	printf("%d\n", strlen(arr[1]));//类型不匹配
	printf("%d\n", strlen(&arr));//报错或者警告,数组的地址,也是代表从第一个开始找到'\0'结束,6
	printf("%d\n", strlen(&arr + 1));//报错或者警告,下一个数组的地址,找到'\0',随机数
	printf("%d\n", strlen(&arr[0] + 1));//第二个元素的地址,找到'\0',5
char *p = "abcdef";
printf("%d\n", sizeof(p));//指针p的大小,4
	printf("%d\n", sizeof(p + 1));//指针p下一个地址的大小,4
	printf("%d\n", sizeof(*p));//指针p所指向内容第一个元素的大小,1
	printf("%d\n", sizeof(p[0]));//第一个元素的大小,1
	printf("%d\n", sizeof(&p));//指针p的地址,4
	printf("%d\n", sizeof(&p + 1));//指针p的地址的下一个地址,4
	printf("%d\n", sizeof(&p[0] + 1));//第二个元素的地址,4
	printf("%d\n", strlen(p));//指针所指向内容的长度,6
	printf("%d\n", strlen(p + 1));//指针所指向内容从第二个元素起到'\0'的长度,5
	printf("%d\n", strlen(*p));//p的第一个元素,类型不匹配
	printf("%d\n", strlen(p[0]));//p的第一个元素,类型不匹配
	printf("%d\n", strlen(&p));//指针p的地址,随机数
	printf("%d\n", strlen(&p + 1));//指针p的地址的下一块内存的地址,随机数
	printf("%d\n", strlen(&p[0] + 1));//指针所指向内容从第二个元素起到'\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]));//a[0]相当于第一个数组的数组名,第一个元素的大小,16
	printf("%d\n", sizeof(a[0] + 1));//a[0]相当于第一个数组的数组名,第一个元素中的第二个元素的地址的大小,4
	printf("%d\n", sizeof(*(a[0] + 1)));//第一个元素中的第二个元素的大小,4
	printf("%d\n", sizeof(a + 1));//a代表第一个元素的地址,a+1是第二个元素的地址,4
	printf("%d\n", sizeof(*(a + 1)));//第二个元素大小,16
	printf("%d\n", sizeof(&a[0] + 1));//第二个元素的地址,4
	printf("%d\n", sizeof(*(&a[0] + 1)));//第二个元素,16
	printf("%d\n", sizeof(*a));//a代表首元素的地址,16
	printf("%d\n", sizeof(a[3]));//越界但不报错,可以读取,16
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值