【C语言】数组相关运算 重点!!!

一、一维数组
int a[] = {1,2,3,4}; 

printf("%d\n",sizeof(a)) ;//16 sizeof+数组名表示整个数组的大小
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 整个数组的地址,地址的字节为4(VC6.0中等于16 是bug)
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第二个元素的地址
  • 总结:
    1.数组名未sizeof内单独放,表示整个数组的大小 如:sizeof(a)
    2.&+数组名,表示整个数组的地址 如:&a
    3.一维数组,数组名未在sizeof内单独放,且前面无&,降为数组首元素地址,*解引用访问首元素

二、字符型数组
char arr[] = {'a','b','c','d','e','f'}; 
printf("%d\n", sizeof(arr)); //6 整个数组的大小
printf("%d\n", sizeof(arr+0)); //4 首元素地址,地址的字节为4
printf("%d\n", sizeof(*arr)); //1 首元素的字节大小
printf("%d\n", sizeof(arr[1])); //1 第一个元素的字节大小
printf("%d\n", sizeof(&arr)); //4 数组的地址,地址的字节为4
printf("%d\n", sizeof(&arr+1)); //4 下一个数组的地址
printf("%d\n", sizeof(&arr[0]+1)); //1 第二个元素的地址

printf("%d\n", strlen(arr)); //随机值 未遇到'\0'停不下来
printf("%d\n", strlen(arr+0)); //随机值 未遇到'\0'停不下来
printf("%d\n", strlen(*arr)); //error 传字符'a'的ASII码值97作为地址,地址冲突
printf("%d\n", strlen(arr[1])); //erro 传字符'b'的ASII码值98作为地址,地址冲突
printf("%d\n", strlen(&arr)); //随机值 x
printf("%d\n", strlen(&arr+1)); //随机值 x+6
printf("%d\n", strlen(&arr[0]+1)); //随机值 x+1
char arr[]="abcdef"
printf("%d\n", sizeof(arr)); //7 包含'\0'
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 下一个数组的地址 与上一个相差7
printf("%d\n", sizeof(&arr[0]+1)); //4 第二个元素的地址

printf("%d\n", strlen(arr)); //6 遇到'\0'停止
printf("%d\n", strlen(arr+0)); //6
printf("%d\n", strlen(*arr)); //error
printf("%d\n", strlen(arr[1])); //error
printf("%d\n", strlen(&arr)); //6
printf("%d\n", strlen(&arr+1)); //随机值 跳过7个元素后面不一定有'\0'
printf("%d\n", strlen(&arr[0]+1)); //5 从'b'开始
char *p = "abcdef";
printf("%d\n", sizeof(p)); //4 指针变量 字节为4
printf("%d\n", sizeof(p+1)); //4 地址  (p+1)指向'b'
printf("%d\n", sizeof(*p)); //1p指向'a'的地址,解引用为'a'的字节
printf("%d\n", sizeof(p[0])); //1 p[0]=*(p+0)
printf("%d\n", sizeof(&p)); //4 p的地址
printf("%d\n", sizeof(&p+1)); //4 p的下一个地址
printf("%d\n", sizeof(&p[0]+1)); //4 'b'的地址

printf("%d\n", strlen(p)); //6 
printf("%d\n", strlen(p+1)); //5
printf("%d\n", strlen(*p)); //error
printf("%d\n", strlen(p[0])); //error
printf("%d\n", strlen(&p)); //随机值,从p的地址开始
printf("%d\n", strlen(&p+1)); //随机值 跳过p的地址开始数
printf("%d\n", strlen(&p[0]+1)); //5 a的地址加1 开始数

三、二维数组
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));//4 第一行第二个元素的地址
printf("%d\n",sizeof(a+1));//4 第二行的地址
printf("%d\n",sizeof(&a[0]+1)); //4第二行的地址 (区别于第二行首元素地址)
printf("%d\n",sizeof(*a));  //6
printf("%d\n",sizeof(a[3]));  //16 sizeof括号内不计算,不是error

- 总结:

二维数组数组名未在sizeof内单独放,且前面无&,降为数组首行地址,*解引用访问二维数组的第一行


[数组知识点整理]https://blog.csdn.net/lxf_style/article/details/79825953(>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值