关于数组方面的大小计算
来源:互联网 发布:如何做免费网络推广 编辑:程序博客网 时间:2024/06/05 02:15
在这些问题的核心是:只有数组名单独在sizeof内部时,才代表整个数组,别的地方数组名一般都代表数组首元素地址,&+数组名,代表整个数组。
#include <stdio.h>#include <stdlib.h>int main(){int a[] = { 1, 2, 3, 4 };printf("%d\n", sizeof(a));// 数组名a单独放在sizeof中代表整个数组 即 4*4=16printf("%d\n", sizeof(a + 0)); // 数组a不是单独放在sizeof中代表数组首元素地址 即 在32位平台为:4 64位平台为:8printf("%d\n", sizeof(*a));// 数组a不是单独放在sizeof中代表数组首元素地址,解引用 即a[0]一个整型的大小: 4printf("%d\n", sizeof(a + 1));// 数组a不是单独放在sizeof中代表数组首元素地址, 即a[1]的地址 即 在32位平台为:4 64位平台为:8printf("%d\n", sizeof(a[1]));// 相当于元素 2 一个整型的大小: 4printf("%d\n", sizeof(&a));// 取地址a,相当于整个数组的地址 但它还是地址 即 在32位平台为:4 64位平台为:8printf("%d\n", sizeof(&a + 1));// 取地址a,相当于整个数组的地址 但它还是地址 &a+1就是下一个数组的地址 即 在32位平台为:4 64位平台为:8printf("%d\n", sizeof(&a[0]));// 取元素的首地址 但它还是地址 即 在32位平台为:4 64位平台为:8printf("%d\n", sizeof(&a[0] + 1));// 相当于第二元素地址 即 在32位平台为:4 64位平台为:8system("pause");return 0;}
#include <stdio.h>#include <stdlib.h>int main(){char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };printf("%d\n", sizeof(arr));// 数组名a单独放在sizeof中代表整个数组 即 为6个字符型 6;printf("%d\n", sizeof(arr + 0));// 数组arr不是单独放在sizeof中代表数组首元素地址,arr+0就是首元素地址 即 在32位平台为:4 64位平台为:8printf("%d\n", sizeof(*arr));// 数组arr不是单独放在sizeof中代表数组首元素地址,解引用相当于'a',即 大小为1;printf("%d\n", sizeof(arr[1]));// 相当于'b',即 大小为 1;printf("%d\n", sizeof(&arr));// 取地址arr,相当于整个数组的地址 但它还是地址 即 在32位平台为:4 64位平台为:8printf("%d\n", sizeof(&arr + 1)); // 取地址arr,相当于整个数组的地址 但它还是地址 &arr + 1就是下一个数组的地址 即 在32位平台为:4 64位平台为:8printf("%d\n", sizeof(&arr[0] + 1)); // 相当于第二元素地址 即 在32位平台为:4 64位平台为:8printf("%d\n", strlen(arr));// 数组名代表首元素地址 ,strlen 需要'\0'来结束,但是由于数组没有‘\0’,可能会越界访问程序出错;printf("%d\n", strlen(arr + 0));// 同上printf("%d\n", strlen(*arr));// 相当于字符'a',而strlen参数为一个地址所以可能会出错;printf("%d\n", strlen(arr[1]));// 同上printf("%d\n", strlen(&arr));// 取地址arr,相当于整个数组的地址 strlen 找下一个数组地址一直到'\0';printf("%d\n", strlen(&arr + 1));// 比上面少找一个数组,从arr后面的数组开始找;printf("%d\n", strlen(&arr[0] + 1));// 相当于从arr第二个元素地址开始找一直到'\0';system("pause");return 0;}
#include <stdio.h>#include <stdlib.h>int main(){char *p = "abcdef";printf("%d\n", sizeof(p)); // p是一个地址 即 在32位平台为:4 64位平台为:8printf("%d\n", sizeof(p + 1));// 依然是一个地址 即 在32位平台为:4 64位平台为:8printf("%d\n", sizeof(*p));// 相当于'a' 大小 即 1printf("%d\n", sizeof(p[0]));// 相当于'a'的大小 即 1printf("%d\n", sizeof(&p));// 相当于p的地址 即 在32位平台为:4 64位平台为:8printf("%d\n", sizeof(&p + 1)); // 下一个char*类型的指针的地址 即 在32位平台为:4 64位平台为:8printf("%d\n", sizeof(&p[0] + 1));// 相当于b的地址 即 在32位平台为:4 64位平台为:8;printf("%d\n", strlen(p));//即 从a的地址开始 6;printf("%d\n", strlen(p + 1)); //即 从b的地址开始 5;printf("%d\n", strlen(*p));//*p代表'a'不是个地址,会出错printf("%d\n", strlen(&p));// 即 从p的地址开始找,直到'\0'printf("%d\n", strlen(&p + 1));// 即 从p的地址的下一个地址开始找,直到'\0'printf("%d\n", strlen(&p[0] + 1));// 即 'b'的地址开始找 即 5system("pause");return 0;}
#include <stdio.h>#include <stdlib.h>int main(){int a[3][4] = { 0 };printf("%d\n", sizeof(a));// 代表整个数组 即 3*4*4 = 48printf("%d\n", sizeof(a[0][0]));// 即第一个元素大小 4printf("%d\n", sizeof(a[0]));// 即第一行的大小 4*4=16printf("%d\n", sizeof(a[0] + 1));// 即 第一行的第二个元素地址 在32位平台为:4 64位平台为:8printf("%d\n", sizeof(a + 1));//即 第二行的地址 在32位平台为:4 64位平台为:8printf("%d\n", sizeof(&a[0] + 1));// 即 第2个元素的地址 在32位平台为:4 64位平台为:8printf("%d\n", sizeof(*a));// 即第一行的大小 4*4=16printf("%d\n", sizeof(a[3]));// 即 相当于第四行的大小 sizeof的括号内部不需要计算 16system("pause");return 0;}
阅读全文
0 0
- 关于数组方面的大小计算
- 关于union大小的计算
- 关于struct大小的计算
- c++数组大小计算
- 关于嵌套结构体大小的计算
- 一个有关计算结构体数组大小的问题
- 汇编 等号伪指令 计算数组和字符串的大小
- C语言基础 使用sizeof计算数组的大小
- 关于利用sizeof计算extern之后的全局变量的大小
- 关于利用sizeof计算extern之后的全局变量的大小
- 关于数组,sizeof(),strlen的计算问题
- 关于类对象大小的 sizeof 计算问题
- 关于类对象大小的 sizeof 计算问题(续)
- 关于类对象大小的 sizeof 计算问题
- 关于类对象大小的 sizeof 计算问题
- 08-15 关于类对象大小的 sizeof 计算问题 .
- 关于类对象大小的 sizeof 计算问题
- [iOS]关于计算文字所占范围大小的方法
- 大数相减
- [LeetCode] 19. Remove Nth Node From End of List
- OC 宏入门
- 利用元数据编写查询的通用方法
- Java中自写ArrayList容器
- 关于数组方面的大小计算
- 《virtualbox完全学习手册》之 虚拟机也玩多屏显示
- 搭建hibernate
- POJ 3311 Hie with the Pie (状态压缩DP ,TSP问题)
- TensorFlow进阶:CNN对CIFAR10图像分类
- Just a Hook HDU
- reveal 4 for xcode 8 2017 reveal配置xcode详解
- 让网页中footer总在底部的有效办法
- 华为OJ——按字节截取字符串