摘要:目录一一维数组与例一详解字符数组与例二练习例三练习字符指针与例四练习二维数组与例五提高二字符数组与例六详解例七练习字符指针与例八练习一操作符作用求变量所占空间的大小求类型创建的变量所占空间的大小一维数组与例一详解
sizeof:操作符
作用:
- 求变量所占空间的大小
- 求类型创建的变量所占空间的大小
int a[] = { 1,2,3,4 }; printf("%d/n", sizeof(a[1]));//第二个元素 printf("%d/n", sizeof(&a[0]));//第一个元素的地址(4/8) printf("%d/n", sizeof(&a[0] + 1));//第二个元素的地址(4/8) printf("%d/n", sizeof(a)); printf("%d/n", sizeof(a + 0)); printf("%d/n", sizeof(a + 1)); printf("%d/n", sizeof(&a)); printf("%d/n", sizeof(*a)); printf("%d/n", sizeof(*&a)); printf("%d/n", sizeof(&a + 1));
X86
下
X64
下
数组名表示整个数组的情况:
- sizeof(数组名)
- &数组名
( )内容 | sizeof()计算结果 |
---|---|
只有数组名 | 整个数组的空间大小 |
数组名+数字 | 地址:4/8 |
&数组名(+数字) | 地址:4/8 |
*数组名,数组名[0] | 第一个元素的字节大小 |
由例一得出的summary可以轻松解决下面这个问题,就不再赘述。
char arr[] = { "a","b","c","d","e","f" }; printf("%d/n", sizeof(arr));//整个数组 6 printf("%d/n", sizeof(arr + 0));//第一个元素的地址 4/8 printf("%d/n", sizeof(*arr));//第一个元素 1 printf("%d/n", sizeof(arr[1]));//第二个元素 1 printf("%d/n", sizeof(&arr));//整个数组的地址 4/8 printf("%d/n", sizeof(&arr + 1));//跳出整个数组,但还是一个地址 4/8 printf("%d/n", sizeof(&arr[0] + 1));//第二个元素的地址 4/8
char arr[] = "abcdef"; printf("%d/n", sizeof(arr));//整个数组 7 printf("%d/n", sizeof(arr + 0));//首元素的地址 4/8 printf("%d/n", sizeof(*arr));//首元素 1 printf("%d/n", sizeof(arr[1]));//第二个元素 1 printf("%d/n", sizeof(&arr));//整个数组的地址 4/8 printf("%d/n", sizeof(&arr + 1));//跳出整个数组(包括/0),但还是一个地址 4/8 printf("%d/n", sizeof(&arr[0] + 1));//第二个元素的地址 4/8
Tip:
- char arr[] = { ‘a’,‘b’,‘c’,‘d’,‘e’,‘f’ };与char arr[] = “abcdef”;的区别
字符指针相关知识请戳?深度剖析指针?
char* p = "abcdef"; printf("%d/n", sizeof(p));//p为指针变量,存放着a的地址 4/8 printf("%d/n", sizeof(p + 1));//p+1是字符b的地址 4/8 printf("%d/n", sizeof(*p));//解引用找到a的值 1 printf("%d/n", sizeof(p[0]));//相等于*(p+0)得到a 1 printf("%d/n", sizeof(&p));//(1) 指针p的地址 4/8 printf("%d/n", sizeof(&p + 1));//(2) 跳过一个指针p的地址 4/8 printf("%d/n", sizeof(&p[0] + 1));//第二个元素b的地址 4/8
int a[3][4] = { 0 }; printf("%d/n", sizeof(a));//整个数组 12*4=48 printf("%d/n", sizeof(a[0][0]));//第1行第1列的元素 4 printf("%d/n", sizeof(a[0]));//第1行数组的数组名 4*4=16 (只有数组名的情况) printf("%d/n", sizeof(a[0] + 1));//数组名+数字表示a[0][1]的地址 4/8 printf("%d/n", sizeof(*(a[0] + 1)));//表示a[0][1] 4 printf("%d/n", sizeof(a + 1));//二维数组的首元素的地址是第一行,a+1第2行的地址 4/8 printf("%d/n", sizeof(*(a + 1)));//第2行的地址解引用 4*4=16 printf("%d/n", sizeof(&a[0] + 1));//取到第1行的地址,+1得到第2行的地址 4/8 printf("%d/n", sizeof(*(&a[0] + 1)));//第2行地址解引用得到第2行数组 16 printf("%d/n", sizeof(*a));//整个数组解引用得到首元素 16 printf("%d/n", sizeof(a[3]));//第4行(假象的一行并没有访问)数组的数组名 16
strlen:库函数
作用:求字符串的长度
char arr[] = { "a","b","c","d","e","f" }; printf("%d/n", strlen(arr));//(1) printf("%d/n", strlen(arr + 0));//(2) printf("%d/n", strlen(*arr));//(3) printf("%d/n", strlen(arr[1]));//(4) printf("%d/n", strlen(&arr));//(5) printf("%d/n", strlen(&arr + 1));//(6) printf("%d/n", strlen(&arr[0] + 1));//(7)
/0
才会停下(3)(4)*arr取出首元素,将首元素a的ASCII码值97传给strlen()
(5)(6)&arr的类型为char ( * )[6]但是strlen()接收的是char * 类型,虽然类型不匹配,但是strlen将&arr转换成char*类型,所以strlen()接收了首元素的地址
char arr[] = "abcdef"; printf("%d/n", strlen(arr));//遇到/0就停止 6 printf("%d/n", strlen(arr + 0));//6 printf("%d/n", strlen(*arr));//ASCII码值给strlen 随机值 printf("%d/n", strlen(arr[1]));//同上 随机值 printf("%d/n", strlen(&arr));//6 printf("%d/n", strlen(&arr + 1));//跳出整个数组 随机值 printf("%d/n", strlen(&arr[0] + 1));//5
char* p = "abcdef"; printf("%d/n", strlen(p));//p存放着a的地址 6 printf("%d/n", strlen(p + 1));//p+1是b的地址 5 printf("%d/n", strlen(*p));//*p是aASCII码值给strlen 随机值 printf("%d/n", strlen(p[0]));//同上 printf("%d/n", strlen(&p));//在指针变量p中找/0 随机值 printf("%d/n", strlen(&p + 1));//跳过整个p的地址 随机值 printf("%d/n", strlen(&p[0] + 1));//第二个元素b的地址 5
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/119940.html
摘要:因此二维数组的实质是一维数组,但是其元素类型是一维数组对数组地址解引用后得到是数组名数组首元素地址例题经典再现二维数组练习字符数组希望本文对你有所帮助 文章目录 ...
此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), 毕竟算法不是做了一遍就能完全记住的. 所以本文适合已经知道解题思路和方法, 想进一步加强理解和记忆的朋友, 并不适合第一次接触此题的朋友(可以根据题号先去力扣看看官方题解, 然后再看本文内容). 关...
摘要:故使用无具体类型,又称通用类型,即可以接收任意类型的指针,但是无法进行指针运算解引用,整数等。求指针所占字节而不是解引用访问权限大小。数组就是整个数组的大小,数组元素则是数组元素的大小,指针大小都为。 ...
摘要:此专栏文章是对力扣上算法题目各种方法的总结和归纳整理出最重要的思路和知识重点并以思维导图形式呈现当然也会加上我对导图的详解目的是为了更方便快捷的记忆和回忆算法重点不用每次都重复看题解毕竟算法不是做了一遍就能完全记住的所 ...
摘要:动态内存开辟申请的空间是在堆区上,堆区上,堆区上。亿,重新分配已申请的空间函数形式参数指向动态内存块的开头。传入的指针是动态内存的地址。柔性数组序柔性数组是标准增加的一类只能在结构体中定义的特殊数组。计算结构体大小时不包含柔性数组。 ...
阅读 3040·2021-11-23 09:51
阅读 3699·2021-10-08 10:05
阅读 3453·2021-09-22 15:35
阅读 3494·2021-09-22 10:02
阅读 2119·2021-09-14 17:57
阅读 2829·2021-08-30 09:49
阅读 384·2021-08-05 10:01
阅读 3202·2019-08-30 15:54