关于数组必须学会的运算
来源:互联网 发布:幼猫吃什么猫粮好 知乎 编辑:程序博客网 时间:2024/06/06 07:26
一位数组数组名单独在sizeof()中,代表整个数组
二维数组a[][],把a[]看成数组名,sizeof(a)中,数组名代表二维数组的首元素地址,也就是第一行数组的地址。
例如a[3][4],a代表二维数组首元素地址,也是第一行数组的地址,而a+1则代表第一行地址+1,就是第二行地址,两个地址相差4个int大小,也就是16个字节。
sizeof求数组大小是要包括\0的,而strlen求数组大小是不包括\0的,但是以\0作为结束标识。同时strlen括号中
为地址。
int a[] = { 1, 2, 3, 4 };printf("%d\n", sizeof(a)); // 16 数组名单独放在sizeof中代表整个数组,求数组大小,以字节为单位,应该为16printf("%d\n", sizeof(a + 0)); // 4 数组名不是单独放在sizeof中,代表数组第一个元素的地址,指针类型,为4printf("%d\n", sizeof(*a)); // 4 *为截引用符号,a代表首元素地址,对首元素地址截引用就是首元素,int类型,大小为4,因此也为4printf("%d\n", sizeof(a + 1)); // 4 a不是单独在sizeof中,a代表首元素地址,a+1代表第二个为元素地址,指针类型,为4printf("%d\n", sizeof(a[1])); // 4 代表第二个元素,是int类型,大小为4printf("%d\n", sizeof(&a)); // 4 数组地址的地址,为4printf("%d\n", sizeof(&a + 1)); // 4 数组地址+1,就跳出这个数组的地址,仍然为地址,为4printf("%d\n", sizeof(&a[0])); // 4 对首元素取地址,等价于a,为4printf("%d\n", sizeof(&a[0] + 1));// 4 首元素地址+1,第二个元素的地址,也为4
char arr[] = {'a','b','c','d','e','f'};printf("%d\n", sizeof(arr)); //代表整个数组,为6printf("%d\n", sizeof(arr+0)); //第一个元素地址,为4printf("%d\n", sizeof(*arr)); //对第一个元素地址截引用,为a多的大小,为1printf("%d\n", sizeof(arr[1])); //第二个元素,b的大小,为1printf("%d\n", sizeof(&arr)); //对整个数组取地址,4printf("%d\n", sizeof(&arr+1)); //整个数组地址+1,跳出数组,依然是地址,为4printf("%d\n", sizeof(&arr[0]+1)); //第一个元素地址+1,代表第二个元素地址,为4printf("%d\n", strlen(arr)); //从a的地址开始,遇到\0结束,生成随机数printf("%d\n", strlen(arr + 0)); //从a的地址开始,遇到\0结束,生成随机数//printf("%d\n", strlen(*arr)); //报错,strlen应该从地址开始,如果是元素就错误,程序崩溃//printf("%d\n", strlen(arr[1])); //等价于*arr,程序崩溃printf("%d\n", strlen(&arr)); //整个数组的地址,遇到\0结束,生成随机数printf("%d\n", strlen(&arr + 1)); //数组的地址+1,跳出数组,依然是遇到\0结束,生成随机数printf("%d\n", strlen(&arr[0] + 1)); //第一个元素地址+1,第二个元素的地址,遇到\0结束,随机数
char *p = "abcdef"; //默认有\0结束printf("%d\n", sizeof(p)); //指针p,a的地址,大小为4printf("%d\n", sizeof(p + 1)); //a的地址+1,b的地址,大小为4printf("%d\n", sizeof(*p)); //对a地址的截引用,为char类型,大小为1printf("%d\n", sizeof(p[0])); //a,char类型,大小为1printf("%d\n", sizeof(&p)); //p的指针,大小为4printf("%d\n", sizeof(&p + 1)); //p的指针+1,跳出p,依然为指针,大小为4printf("%d\n", sizeof(&p[0] + 1)); //首元素地址+1,依然是指针,大小为4printf("%d\n", strlen(p)); //a的地址,遇到\0结束,但不包括\0,大小为6printf("%d\n", strlen(p + 1)); //b的地址,遇到\0结束,大小为5//printf("%d\n", strlen(*p)); //a,strlen(地址),a不是地址,程序奔溃//printf("%d\n", strlen(p[0])); //等价于*p,a不是地址,程序奔溃printf("%d\n", strlen(&p)); //p的地址,二级指针,有警告,级别不同,生成随机数printf("%d\n", strlen(&p + 1)); //p的地址+1,跳出p,二级指针,有警告,级别不同,生成随机数printf("%d\n", strlen(&p[0] + 1)); //b的地址,从b开始,大小为5
////二维数组 //int b[3][4] = {0}; //printf("%d\n", sizeof(b)); //代表整个数组,大小为48//printf("%d\n", sizeof(b[0][0])); //第一个元素,下表为[0][0],大小为4//printf("%d\n", sizeof(b[0])); //把a[0]看成数组名,单独在sizeof中,代表整个数组a[0]大小为16//printf("%d\n", sizeof(b[0] + 1)); //a[0]看成数组名,不是单独在sizeof中,代表a[0]一位数组的地址,指针类型,大小为4//printf("%d\n", sizeof(b + 1)); //指针类型,大小为4//printf("%d\n", sizeof(&b[0] + 1)); //对第一行元素取地址,+1后还是地址,等价于a+1,大小为4//printf("%d\n", sizeof(*b)); //a代表第一行元素,*截引用,为第一行元素,大小为16//printf("%d\n", sizeof(b[3])); //越界,但是编译不占内存,大小为16
int b[3][4] = { 0 };printf("%p\n", b ); //a代表二维数组的第一行地址printf("%p\n", b + 1); //a+1代表二维数组第一行地址+1,比第一行地址大16
1 0
- 关于数组必须学会的运算
- 关于数组我们必须会的的运算
- C语言中关于数组的运算
- 关于多维数组的运算问题
- 必须学会的几个网络测试命令
- 必须学会的几个网络测试命令
- java新手必须学会的类型转换
- 必须学会的几个网络测试命令
- 必须学会的几个网络测试命令
- 必须学会的几个网络测试命令
- 必须学会的几个网络测试命令
- 管理者必须学会的四大武器
- IT人必须学会的职场四原则
- IT人必须学会的职场四原则
- IT人必须学会的职场四原则
- IT人必须学会的职场四原则
- IT人必须学会的职场四原则
- IT男必须学会的理财方法
- "Windows7 内部版本7601 此Windows副本不是正版"解决办法
- 猴子分苹果
- 由自动装箱和拆箱引发我看Integer源码
- TCP/IP
- java设计模式之中介者模式
- 关于数组必须学会的运算
- [蓝桥杯]-买不到的数目
- 2015年第六届蓝桥杯C/C++程序设计本科B组省赛-九数组分数
- Linux的文件权限与目录配置
- pie hist plot boxplot
- 解决了unmet peer dependency
- 从服务端架构设计角度,深入理解大型APP架构升级
- centos7全分布模式安装hadoop--hadoop安装系列之二
- 【机器学习】k-近邻算法(kNN) 学习笔记