作者:旧梦拾遗186
专栏:C语言编程----小比特成长日记
每日励志:
人生的路,靠自己一步步走去,真正能保护你的,是你自己的人格选择和文化选择,那么反过来,真正能伤害你的,也是一样,自己的选择——余秋雨
目录
一.前言:
二.一维数组:
1.题目:
2.解析:
3.答案:
4.易错点回顾:
三.字符数组:
题目一:
a)解析:
c)答案
d)易错点重现:
题目二:
a)解析:
b)答案:
题目三:
a) 解析:
b)答案:
题目四:
a)解析
题目五:
a)解析:
编辑
四.二维数组
a)解析:
五结语:
今天小编带大家学习,指针和数组题目的练习,做题是深入了解知识的关键,千万不可骄傲自满,要保持空卑心态,虚心学习。
#include
int main() { int a[] = { 1,2,3,4 }; printf("%d\n", sizeof(a)); printf("%d\n", sizeof(a + 0)); printf("%d\n", sizeof(*a)); printf("%d\n", sizeof(a + 1)); printf("%d\n", sizeof(a[1])); printf("%d\n", sizeof(&a)); printf("%d\n", sizeof(*&a)); printf("%d\n", sizeof(&a + 1)); printf("%d\n", sizeof(&a[0])); printf("%d\n", sizeof(&a[0] + 1)); return 0; }
注意:
1.我们要知道sizeof()计算的空间所占字节大小,
2.数组名是首元素地址(两个例外:1.&数组名表示整个数组的地址,sizeof(数组名)表示整个数组)
3.要知道地址在32位平台为4字节,64位平台为8字节
4.当前平台为x86平台(32位平台)
int main() { int a[] = { 1,2,3,4 }; printf("%d\n", sizeof(&a + 1));//4/8 //&a取出的是数组的地址 //&a--> int(*)[4] //&a+1 是从数组a的地址向后跳过了一个(4个整型元素的)数组的大小 //&a+1还是地址,是地址就是4/8字节 // printf("%d\n", sizeof(&a[0]));//4/8 //&a[0]就是第一个元素的地址 //计算的是地址的大小 printf("%d\n", sizeof(&a[0] + 1));//4/8 //&a[0]+1是第二个元素的地址 //大小是4/8个字节 //&a[0]+1 ---> &a[1] // printf("%d\n", sizeof(a));//16 //sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节 printf("%d\n", sizeof(a + 0));//4 //a不是单独放在sizeof内部,也没有取地址,所以a就是首元素的地址,a+0还是首元素的地址 //是地址,大小就是4/8个字节 printf("%d\n", sizeof(*a));//4 //*a中的a是数组首元素的地址,*a就是对首元素的地址解引用,找到的就是首元素 //首元素的大小就是4个字节 printf("%d\n", sizeof(a + 1)); //这里的a是数组首元素的地址 //a+1是第二个元素的地址 //sizeof(a+1)就是地址的大小 printf("%d\n", sizeof(a[1]));//4 //计算的是第二个元素的大小 printf("%d\n", sizeof(&a));//4/8 //&a取出的数组的地址,数组的地址,也就是个地址 printf("%d\n", sizeof(*&a));//16 //这里有两种理解方式: //1.&a----> int(*)[4] //&a拿到的是数组名的地址,类型是 int(*)[4],是一种数组指针 //数组指针解引用找到的是数组 //*&a ---> a // //2. //&和*抵消了 //*&a ---> a // return 0; }
printf("%d\n", sizeof(*&a));//16
这里有两种理解方式:
1.&a----> int(*)[4]
&a拿到的是数组名的地址,类型是 int(*)[4],是一种数组指针
数组指针解引用找到的是数组
*&a ---> a
2.&和*抵消了
*&a ---> aprintf("%d\n", sizeof(a + 0));//4
a不是单独放在sizeof内部,也没有取地址,所以a就是首元素的地址,a+0还是首元素的地 址
是地址,大小就是4/8个字节
int main() { //字符数组 char arr[] = { 'a','b','c','d','e','f' }; printf("%d\n", sizeof(arr)); printf("%d\n", sizeof(arr + 0)); printf("%d\n", sizeof(*arr)); printf("%d\n", sizeof(arr[1])); printf("%d\n", sizeof(&arr)); printf("%d\n", sizeof(&arr + 1)); printf("%d\n", sizeof(&arr[0] + 1)); return 0; }
//int main() //{ // char arr[] = { 'a','b','c','d','e','f' }; // printf("%d\n", sizeof(arr));//6 // //sizeof(数组名) // printf("%d\n", sizeof(arr + 0));//4/8 // //arr + 0 是数组首元素的地址 // printf("%d\n", sizeof(*arr));//1 // //*arr就是数组的首元素,大小是1字节 // //*arr --> arr[0] // //*(arr+0) --> arr[0] // printf("%d\n", sizeof(arr[1]));//1 // printf("%d\n", sizeof(&arr));//4/8 // //&arr是数组的地址,是地址就是4/8个字节 // printf("%d\n", sizeof(&arr + 1));//4/8 // //&arr + 1是数组后的地址 // // // printf("%d\n", sizeof(&arr[0] + 1));//4/8 // //&arr[0] + 1是第二个元素的地址 // // // return 0; //}
printf("%d\n", sizeof(*arr));//1
//*arr就是数组的首元素,大小是1字节
//*arr --> arr[0]
//*(arr+0) --> arr[0]
#include
int main() { //字符数组 char arr[] = { 'a','b','c','d','e','f' }; printf("%d\n", strlen(arr)); printf("%d\n", strlen(arr + 0)); printf("%d\n", strlen(*arr)); printf("%d\n", strlen(arr[1])); printf("%d\n", strlen(&arr)); printf("%d\n", strlen(&arr + 1)); printf("%d\n", strlen(&arr[0] + 1)); return 0; }
#include
int main() { char arr[] = { 'a','b','c','d','e','f' }; printf("%d\n", strlen(arr));//随机值 printf("%d\n", strlen(arr + 0));//随机值 // printf("%d\n", strlen(*arr));//--> strlen('a');-->strlen(97);//野指针 // printf("%d\n", strlen(arr[1]));//-->strlen('b')-->strlen(98); printf("%d\n", strlen(&arr));//随机值 printf("%d\n", strlen(&arr + 1));//随机值-6 printf("%d\n", strlen(&arr[0] + 1));//随机值-1 return 0; } 注意:这里arr[]结束标识\0是随机出现的,所以在测量时会产生随机值。
注意一下strlen的功能:
里面传入的是指针,也就是地址。
所以当传入数字时会产生野指针,编译器报错;
1.随机值2.随机值3.报错4.报错5.随机值6.随机值-6 7.随机值-1
#include
int main() { char arr[] = "abcdef"; printf("%d\n", sizeof(arr)); printf("%d\n", sizeof(arr+0)); printf("%d\n", sizeof(*arr)); printf("%d\n", sizeof(arr[1])); printf("%d\n", sizeof(&arr)); printf("%d\n", sizeof(&arr+1)); printf("%d\n", sizeof(&arr[0]+1)); return 0; }
#include
int main() { char* p = "abcdef"; [a b c d e f \0] //printf("%d\n", sizeof(arr));//7 //printf("%d\n", sizeof(arr + 0));//4/8->&a[0]地址的字节大小为4 //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 return 0; }
#include
int main() { char* arr = "abcdef"; printf("%d\n", strlen(arr)); printf("%d\n", strlen(arr + 0)); printf("%d\n", strlen(*arr)); printf("%d\n", strlen(arr[1])); printf("%d\n", strlen(&arr)); printf("%d\n", strlen(&arr + 1)); printf("%d\n", strlen(&arr[0] + 1)); return 0; }
注意:此字符串有\0结尾
int main() { char* arr = "abcdef"; printf("%d\n", strlen(arr));//6 printf("%d\n", strlen(arr + 0));//6 //printf("%d\n", strlen(*arr));//传入的不是地址产生野指针err //printf("%d\n", strlen(arr[1]));//err printf("%d\n", strlen(&arr));//6 printf("%d\n", strlen(&arr + 1));//跳过了整个数组产生随机值 printf("%d\n", strlen(&arr[0] + 1));//5 return 0; }
#include
#include int main() { char* p = "abcdef"; printf("%d\n", sizeof(p)); printf("%d\n", sizeof(p + 1)); printf("%d\n", sizeof(*p)); printf("%d\n", sizeof(p[0])); printf("%d\n", sizeof(&p)); printf("%d\n", sizeof(&p + 1)); printf("%d\n", sizeof(&p[0] + 1)); printf("%d\n", strlen(p)); printf("%d\n", strlen(p + 1)); printf("%d\n", strlen(*p)); printf("%d\n", strlen(p[0])); printf("%d\n", strlen(&p)); printf("%d\n", strlen(&p + 1)); printf("%d\n", strlen(&p[0] + 1)); return 0; }
#include
#include int main() { char* p = "abcdef"; printf("%d\n", sizeof(p));//4/8 //p为指针变量,大小为4/8 printf("%d\n", sizeof(p + 1));//4/8 //地址大小为4/8 printf("%d\n", sizeof(*p));//1 //就是第一个元素 printf("%d\n", sizeof(p[0]));//1 //第一个元素 printf("%d\n", sizeof(&p));//4/8 //地址就是4/8 printf("%d\n", sizeof(&p + 1));//4/8 //地址就是4/8 printf("%d\n", sizeof(&p[0] + 1));//4/8 //地址就是4/8 printf("%d\n", strlen(p));//6 //从首元素地址开始到结束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的角度上,后面的'\0'不确定 printf("%d\n", strlen(&p + 1));//随机值 //还是随机值 printf("%d\n", strlen(&p[0] + 1));//5 //从第二个元素的地址开始 return 0; }
这里还有关于二维数组的题目:
#include
int main() { int a[3][4] = { 0 }; printf("%d\n", sizeof(a)); printf("%d\n", sizeof(a[0][0])); printf("%d\n", sizeof(a[0])); printf("%d\n", sizeof(a[0] + 1)); printf("%d\n", sizeof(*(a[0] + 1))); printf("%d\n", sizeof(a + 1)); printf("%d\n", sizeof(*(a + 1))); printf("%d\n", sizeof(&a[0] + 1)); printf("%d\n", sizeof(*(&a[0] + 1))); printf("%d\n", sizeof(*a)); printf("%d\n", sizeof(a[3])); return 0; }
#include
int main() { int a[3][4] = { 0 }; printf("%d\n", sizeof(a));//48 //3行4列,12*4=48 printf("%d\n", sizeof(a[0][0]));//4 //第一行第一列元素 printf("%d\n", sizeof(a[0]));//16 //第一行,因为此时a[0]挨着sizeof即是一维数组的大小:4*4=16 printf("%d\n", sizeof(a[0] + 1));//4/8 //a[0]没有挨着sizeof,a[0]代表的是第一行整个一维数组首元素的地址,既第一行第一列的地址 //a[0]+1就是第一行第二列的地址,是地址就是4/8 printf("%d\n", sizeof(*(a[0] + 1)));//4 //就是第一行第二列的元素,大小是4个字节 printf("%d\n", sizeof(a + 1));//4/8 //a虽然二维数组的地址,但是并没有单独放在sizeof内部,也没取地址 //a表示首元素的地址,二维数组的首元素是它的第一行,a就是第一行的地址 //a+1就是跳过第一行,表示第二行的地址 //地址就是4/8个字节 printf("%d\n", sizeof(*(a + 1)));//16 //相当于第二行的大小 printf("%d\n", sizeof(&a[0] + 1));//4/8 //&a[0]得到的是第一行的地址 //&a[0]+1得到的是第二行的地址 //地址大小就是4/8 printf("%d\n", sizeof(*(&a[0] + 1)));//16 //得到的是第二行的大小 printf("%d\n", sizeof(*a));//16 //a表示首元素的地址,就是第一行的地址 //*a就是第一行地址的解引用,取到的就是第一行 //第一行的大小就是16 printf("%d\n", sizeof(a[3]));//16 //这里可能会有人说越界访问了,会有问题 //但是实际上并不会: //我们并没有对其进行操作,只是访问 //可以举个例子:int a = 10;sizeof(int);sizeof(a); //我们计算a的时候,只需要知道a的类型就知道几个字节了 //对于a[3]也是一样的道理,类型是确定的,所以为16 return 0; }
每个人的成长都是能力和想要得到的东西,不断匹配的过程,当你的才华和欲望不匹配时,你就该静下心来学习了,如果小编的总结能对你有所帮助,希望小伙伴们三连加关注哦,你的支持是小编创作的最大动力。