珠海网站建设解决方案,苏州工业园区两学一做教育网站,西安网站设计 牛人网络,wordpress 多站 列表大家好#xff0c;我是苏貝#xff0c;本篇博客带大家了解指针和数组笔试题解析#xff0c;如果你觉得我写的还不错的话#xff0c;可以给我一个赞#x1f44d;吗#xff0c;感谢❤️ 目录 1.前言2.一维数组2.字符数组2.12.22.32.42.52.6 1.前言
本篇文章是讲述在不同数… 大家好我是苏貝本篇博客带大家了解指针和数组笔试题解析如果你觉得我写的还不错的话可以给我一个赞吗感谢❤️ 目录 1.前言2.一维数组2.字符数组2.12.22.32.42.52.6 1.前言
本篇文章是讲述在不同数组和指针的条件下使用sizeof和strlen让我们对数组和指针的理解更深。
数组名一般表示首元素地址除以下2种情况 1.sizeof(数组名)括号里面只有数组名此时数组名表示整个数组计算的是整个数组的大小 2.数组名数组名表示整个数组取出的是整个数组的地址
指针变量的大小为4/8byte 1.在32位机器下每个地址有32个比特位即32/84个字节所以指针变量的大小也为4个字节 2.在64位机器下每个地址有64个比特位即64/88个字节所以指针变量的大小也为8个字节
2.一维数组
思考下面代码的结果
int a[] {1,2,3,4};
printf(%d\n,sizeof(a));//1
printf(%d\n,sizeof(a0));//2
printf(%d\n,sizeof(*a));//3
printf(%d\n,sizeof(a1));//4
printf(%d\n,sizeof(a[1]));//5
printf(%d\n,sizeof(a));//6
printf(%d\n,sizeof(*a));//7
printf(%d\n,sizeof(a1));//8
printf(%d\n,sizeof(a[0]));//9
printf(%d\n,sizeof(a[0]1));//10结果 1.16bytesizeof(数组名)括号里面只有数组名此时数组名表示整个数组计算的是整个数组的大小4*sizeof(int)16 2.4/8bytesizeof后面括号内不止有数组名所以该数组名代表首元素地址而非整个数组首元素地址0首元素地址是地址就是4/8byte 3.4bytea是首元素地址*a表示对首元素地址解引用找到首元素首元素类型为int所以sizeof(int)4 4.4/8bytea是首元素地址a1是第二个元素的地址是地址就是4/8byte 5.4bytea[1]是第二个元素元素类型为int所以sizeof(int)4 6.4/8bytea表示取出的是整个数组的地址是地址就是4/8byte 7.16bytea表示取出的是整个数组的地址再对整个数组的地址解引用找到整个数组整个数组的大小为16byte 8.4/8bytea表示取出的是整个数组的地址a1表示跳过整个数组后的地址如下图是地址就是4/8byte 9.4/8bytea[0]表示取出首元素地址是地址就是4/8byte 10.4/8bytea[0]表示取出首元素地址1表示第二个元素的地址是地址就是4/8byte 2.字符数组
2.1
char arr[] {a,b,c,d,e,f};
printf(%d\n, sizeof(arr));//1
printf(%d\n, sizeof(arr0));//2
printf(%d\n, sizeof(*arr));//3
printf(%d\n, sizeof(arr[1]));//4
printf(%d\n, sizeof(arr));//5
printf(%d\n, sizeof(arr1));//6
printf(%d\n, sizeof(arr[0]1));//7结果 1.6bytesizeof(arr)表示整个数组的大小6*sizeof(char)6 2.4/8bytesizeof后面括号内不止有数组名所以该数组名代表首元素地址而非整个数组首元素地址0首元素地址是地址就是4/8byte 3.1bytearr是首元素地址*arr表示对首元素地址解引用找到首元素首元素类型为char所以sizeof(char)1 4.1bytearr[1]是第二个元素元素类型为char所以sizeof(char)1 5.4/8bytearr表示取出的是整个数组的地址是地址就是4/8byte 6.4/8bytearr表示取出的是整个数组的地址arr1表示跳过整个数组后的地址如上图是地址就是4/8byte 7.4/8bytearr[0]表示取出首元素地址1表示第二个元素的地址是地址就是4/8byte
2.2
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结果 1.随机值strlen计算的是’\0’之前的字符个数arr是首元素地址strlen(arr)表示从首元素开始一直向后直至找到’\0’由于数组arr中没有’\0’所以strlen一直会找到数组外我们不确定的某一位置停下所以为随机值 2.随机值arr0表示的是首元素地址然后同上 3.错误如下图arr表示的是首元素地址* arr表示对首元素地址解引用找到首元素’a’字符在内存中存储的是字符的ASCII码值a的ASCII码值97。strlen函数的参数为const char * str是指针站在strlen的角度是将实参’a’–97当作地址直接进行访问这是非法访问会报错 4.错误如下图同3 5.随机值arr的类型为char(*)[6]而strlen函数的参数类型为const char * 所以将arr强制类型转化为const char * 类型即为首元素地址然后同1 6.随机值arr1的类型为char( *)[6]然后同5 7.随机值arr[0] 1是第二个元素的地址然后同1
2.3
char arr[] abcdef;
printf(%d\n, sizeof(arr));//1
printf(%d\n, sizeof(arr0));//2
printf(%d\n, sizeof(*arr));//3
printf(%d\n, sizeof(arr[1]));//4
printf(%d\n, sizeof(arr));//5
printf(%d\n, sizeof(arr1));//6
printf(%d\n, sizeof(arr[0]1));//7结果 1.7bytearr数组里面的元素实际为 ‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘\0’sizeof(数组名)整个数组所占空间的大小7*sizeof(char)7 2.4/8bytesizeof里面不止有arr所以此时的arr是首元素地址arr0也是首元素地址是地址就是4/8byte 3.1bytesizeof里面不止有arr所以此时的arr是首元素地址再对地址进行解引用找到首元素sizeof首元素1byte 4.1byte 5.4/8bytearr表示取出的是整个数组的地址是地址就是4/8byte 6.4/8bytearr表示取出的是整个数组的地址arr1表示跳过整个数组后的地址是地址就是4/8byte 7.4/8bytearr[0]表示取出首元素地址1表示第二个元素的地址是地址就是4/8byte
2.4
char arr[] abcdef;
printf(%d\n, strlen(arr));//1
printf(%d\n, strlen(arr0));//2
printf(%d\n, strlen(*arr));//3
printf(%d\n, strlen(arr[1]));//4
printf(%d\n, strlen(arr));//5
printf(%d\n, strlen(arr1));//6
printf(%d\n, strlen(arr[0]1));//7结果 1.6bytearr数组里面的元素实际为 ‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘\0’strlen计算的是’\0’之前的元素个数arr是首元素地址所以从首元素开始往后数直到遇见’\0’停止‘\0’之前有6个元素 2.6bytearr数组里面的元素实际为 ‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,’\0’strlen计算的是’\0’之前的元素个数arr0表示的是首元素地址所以从首元素开始往后数直到遇见’\0’停止‘\0’之前有6个元素 3.错误arr表示的是首元素地址* arr表示对首元素地址解引用找到首元素’a’字符在内存中存储的是字符的ASCII码值a的ASCII码值97。strlen函数的参数为const char * str是指针站在strlen的角度是将实参’a’–97当作地址直接进行访问这是非法访问会报错 4.错误arr[1]表示的是第二个元素’b’字符在内存中存储的是字符的ASCII码值b的ASCII码值98。strlen函数的参数为const char * str是指针站在strlen的角度是将实参’b’–98当作地址直接进行访问这是非法访问会报错 5.6bytearr的类型为char(*)[6]而strlen函数的参数类型为const char * 所以将arr强制类型转化为const char * 类型即为首元素地址然后同1 6.随机值arr1的类型为char( *)[6]表示跳过整个数组后的地址然后同5 7.5bytearr[0] 1是第二个元素的地址然后同1
2.5
char *p abcdef;
printf(%d\n, sizeof(p));//1
printf(%d\n, sizeof(p1));//2
printf(%d\n, sizeof(*p));//3
printf(%d\n, sizeof(p[0]));//4
printf(%d\n, sizeof(p));//5
printf(%d\n, sizeof(p1));//6
printf(%d\n, sizeof(p[0]1));//7结果 1.4/8byte“abcdef”是常量字符串指针变量p里面存的是字符’a’的地址而非整个常量字符串的地址。是指针(地址)就是4/8byte 2.4/8byte“abcdef”是常量字符串指针变量p里面存的是字符’a’的地址而非整个常量字符串的地址p1指向的是字符’a’的下一位即字符’b’是指针(地址)就是4/8byte 3.1byte指针变量p里面存的是字符’a’的地址所以对p解引用找到字符’a’a所占空间大小为1byte 4.1bytep[0] * (p0)‘a’,a所占空间大小为1byte 5.4/8bytesizeof里面的是指针变量的地址是指针(地址)就是4/8byte 6.4/8bytep1表示跳过指针变量p的下一个地址是地址就是4/8byte 7.4/8bytep[0]1 * p01字符’b’的地址是地址就是4/8byte
2.6
char *p abcdef;
printf(%d\n, strlen(p));//1
printf(%d\n, strlen(p1));//2
printf(%d\n, strlen(*p));//3
printf(%d\n, strlen(p[0]));//4
printf(%d\n, strlen(p));//5
printf(%d\n, strlen(p1));//6
printf(%d\n, strlen(p[0]1));//7结果 1.6byte常量字符串在结尾处有一个隐藏的’\0’所以常量字符串实际为abcdef\0指针变量p里面存的是字符’a’的地址strlen计算的是’\0’之前的元素个数所以从字符’a’开始往后数直到遇见’\0’停止‘\0’之前有6个元素 2.5bytep1指向的是字符’a’的下一位即字符’b’从字符’b’开始往后数直到遇见’\0’停止‘\0’之前有5个元素 3.错误指针变量p里面存的是字符’a’的地址对p解引用找到字符’a’字符在内存中存储的是字符的ASCII码值a的ASCII码值97。strlen函数的参数为const char * str是指针站在strlen的角度是将实参’a’–97当作地址直接进行访问这是非法访问会报错 4.错误p[0] * (p0) ‘a’站在strlen的角度是将实参’a’–97当作地址直接进行访问这是非法访问会报错 5.随机值p表示取出指针变量p的地址从指针变量p开始往后数直到遇见’\0’停止但是我们并不知道什么时候能遇见’\0’所以为随机值 6.随机值p1表示跳过指针变量p后的地址从跳过指针变量p后的地址所存的字符开始往后数直到遇见’\0’停止但是我们并不知道什么时候能遇见’\0’所以为随机值 7.5bytep[0]1 * (p0)1字符’b’的地址从字符’b’开始往后数直到遇见’\0’停止\0’之前有5个元素 好了那么本篇博客就到此结束了如果你觉得本篇博客对你有些帮助可以给个大大的赞吗感谢看到这里我们下篇博客见❤️