做电商卖玉器的网站,北京快三走势图今天,中国住房城乡建设部官方网站,番禺建设局网站首页指针的深入理解#xff08;六#xff09; 个人主页#xff1a;大白的编程日记 感谢遇见#xff0c;我们一起学习进步#xff01; 文章目录 指针的深入理解#xff08;六#xff09;前言一. sizeof和strlen1.1sizeof1.2strlen1.3sizeof和strlen对比 二.数组名和指针加减…指针的深入理解六 个人主页大白的编程日记 感谢遇见我们一起学习进步 文章目录 指针的深入理解六前言一. sizeof和strlen1.1sizeof1.2strlen1.3sizeof和strlen对比 二.数组名和指针加减2.1数组名的理解2.2指针加减整数2.3指针的大小 三. 数组和指针笔试题解析3.1 一维数组3.2 字符数组3.3常量字符串 四.二维数组4.1二维数组的理解4.2二维数组练习 后言 前言 经过前面的学习我们已经把指针的内容全部学完了。所谓”纸上得来终觉浅绝知此事要躬行“。今天小编就带着大家进行指针知识的练习也相当与复习一遍学过的内容。我们进入正题向着大厂进发 一. sizeof和strlen
1.1sizeof
sizeof
在学习操作符的时候我们学习了 sizeof sizeof 计算变量所占内存内存空间大小的单位是字节如果操作数是类型的话计算的是使⽤类型创建的变量所占内存空间的大小。 sizeof 只关注占用内存空间的大小不在乎内存中存放什么数据。
#inculde stdio.h
int main()
{int a 10;printf(%d\n, sizeof(a));printf(%d\n, sizeof a);printf(%d\n, sizeof(int));return 0;
}1.2strlen
strlen
strlen 是C语言库函数功能是求字符串长度。函数原型如下 size_t strlen ( const char * str );strlen函数是用来统计字符串个数的统计的是从 strlen 函数的参数 str 中这个地址开始向后 \0 之前字符串中字符的个数。 strlen 函数会⼀直向后找 \0 字符直到找到为止所以可能存在越界查找。 注意strlen函数的使用需要包含头文件string.h
#include stdio.h
#includestring.h
int main()
{char arr1[3] {a, b, c};char arr2[] abc;printf(%d\n, strlen(arr1));printf(%d\n, strlen(arr2));printf(%d\n, sizeof(arr1));printf(%d\n, sizeof(arr1));return 0;
}1.3sizeof和strlen对比 本质sizeof是操作符 strlen是库函数。功能sizeof计算空间大小strlen统计字符个数。注意事项sizeof不关注内存内容只关注内存大小 strlen通过观察内存的\0统计遇到\0停下。若没有\0则可能产生越界现象。
二.数组名和指针加减
2.1数组名的理解
数组名是数组首元素的地址。 但有两个特殊情况sizeof(数组名)此时的数组名表示整个数组 计算的是整个数组的大小单位是字节。 数组名此时的数组名也表示整个数组取出的是整个数组的大小。 注意括号里必须只有数组名 2.2指针加减整数
指针加减整数指针向前或向后移动。指针加减移动多大距离单位是字节取决于指针类型举例int类型的指针1跳过一个整形指向下一个整型。 指针地址4 char类型的指针1跳过一个字符指向下一个字符。 指针地址1 2.3指针的大小
指针大小取决于当前环境32位环境指针大小4字节64位环境指针大小8字节 三. 数组和指针笔试题解析
3.1 一维数组
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));//10printf(%d\n,sizeof(a));//1
//数组名单独放在sizeof里面
//计算整个数组的大小 4*416printf(%d\n,sizeof(a0));//2
//a没有单独放在sizeof里面
//a就是首元素地址
//指针0跳过0的整型元素还是指向首元素
//地址就是指针指针的大小是4/8printf(%d\n,sizeof(*a));//3
//a是数组首元素地址*a就是首元素
//int类型4字节大小printf(%d\n,sizeof(a1));//4
//a首元素地址a1跳过一个整型指向第二个元素
//指针加减整数还是指针大小4/8字节printf(%d\n,sizeof(a[1]));//5
//a[1]就是数组第二个元素大小为4字节printf(%d\n,sizeof(a));//6
//a取出数组首元素地址数组的地址也是指针
//计算指针的大小4/8字节printf(%d\n,sizeof(*a));//7
//a取出整个数组的地址*(数组的地址)访问呢整个数组
//计算整个数组的大小4*416printf(%d\n,sizeof(a1));//8
//a是整个数组的地址类型是数组指针1跳过整个数组
//指向数组后第一个字节的地址地址是指针
//大小4/8字节printf(%d\n,sizeof(a[0]));//9
//a[0]数组首元素a[0]取出数组首元素地址
//地址就是指针4/8字节printf(%d\n,sizeof(a[0]1));//10
//a[0]数组首元素a[0]取出数组首元素地址
//首元素地址1跳过一个整型指向第二个元素
//还是指针4/8字节验证64位环境 32位环境 3.2 字符数组
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));//7printf(%d\n, sizeof(arr));//1
//arr数组名单独放在sizeof内部计算整个数组的大小1*66字节printf(%d\n, sizeof(arr0));//2
//arr是数组名就是数组首元素的地址0跳过0的字节指向首元素
//还是指针4/8字节printf(%d\n, sizeof(*arr));//3
//arr是数组首元素的地址*arr解引用访问数组首元素1字节printf(%d\n, sizeof(arr[1]));//4
//arr[1]是数组第二个元素1字节printf(%d\n, sizeof(arr));//5
//arr是数组名arr取出整个数组的地址数组的地址也是地址
//还是指针4/8字节printf(%d\n, sizeof(arr1));//6
//arr是整个数组的地址1跳过整个数组指向数组后面的位置
//还是指针4/8个字节printf(%d\n, sizeof(arr[0]1));//7
//arr[0]取出数组首元素的地址1跳过一个字节指向第二个字符
//还是指针4/8字节验证64位环境 32位环境 char arr[] {a,b,c,d,e,f};数组没有\0
printf(%d\n, strlen(arr));//1
//arr是数组名数组首元素地址开始统计
//没有\0,什么时候遇到\0不知道是随机值
printf(%d\n, strlen(arr0));//2
//arr是数组名是数组首元素地址
//arr0跳过0个字节指向第一个元素也是和上面一样的随机值
printf(%d\n, strlen(*arr));//3
//arr是数组名是数组名首元素地址*arr-a-ascllm码值97
//相当于把97作为地址传给strlenstrlen接收野指针代码是错误的
printf(%d\n, strlen(arr[1]));//4
//arr[1]-b-98,把98传给strlen,也是野指针也是错误的
printf(%d\n, strlen(arr));
printf(%d\n, strlen(arr1));
printf(%d\n, strlen(arr[0]1))printf(%d\n, strlen(arr));//1
//arr是数组名数组首元素地址开始统计
//没有\0,什么时候遇到\0不知道是随机值printf(%d\n, strlen(arr0));//2
//arr是数组名是数组首元素地址
//arr0跳过0个字节指向第一个元素也是和上面一样的随机值printf(%d\n, strlen(*arr));//3
//arr是数组名是数组名首元素地址*arr-a-ascllm码值97
//相当于把97作为地址传给strlenstrlen接收野指针代码是错误的 printf(%d\n, strlen(arr[1]));//4
//arr[1]-b-98,把98传给strlen,也是野指针也是错误的printf(%d\n, strlen(arr));//p1表示
//arr取出数组的地址数组的地址也指向数组首元素设为x随机值
printf(%d\n, strlen(arr1));//p2表示
//arr取出数组的地址arr1跳过数组指向数组后的位置x-6的随机值
printf(%d\n, strlen(arr[0]1))//p3表示
//arr[0]是数组首元素地址arr[0]1跳过一个字节指向第二个元素
//x-1的随机值验证
3.3常量字符串
双引号里面的字符串就是常量字符串常量字符串末尾自动补上\0.
char arr[] abcdef//常量字符串末尾自动补\0
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));//7printf(%d\n, strlen(arr));//1
//arr是数组名就是数组首元素地址统计6个字符。printf(%d\n, strlen(arr0));//2
//arr是数组名就是数组首元素地址,0跳过0个字节
//还是数组首元素地址//统计6个字符printf(%d\n, strlen(*arr));//3
//arr是数组名就是数组首元素的地址*arr就是首元素a
//a的ascll码值是97相当于把97作为地址传递给strlen,strlen得到野指针
//此时代码是有问题的printf(%d\n, strlen(arr[1]));//4
//arr[1]就是数组第二个元素相当于把b--98传给strlen,
//也是野指针也有问题printf(%d\n, strlen(arr));//5
//arr是数组名arr是数组首元素的地址数组首元素的地址也指向首元素
//统计的还是6个字符printf(%d\n, strlen(arr1));//6
//arr是数组名arr是数组首元素的地址数组首元素的地址也指向首元素
//arr1跳过一个数组指向数组后面的位置什么时候遇到\0不知道
//所以是随机值printf(%d\n, strlen(arr[0]1));//7
//arr[0]取出数组首元素的地址1跳过一个字节指向第二个字符
//从第二个字符统计统计5个字符四.二维数组
4.1二维数组的理解 我们可以把二维数组看一个以数组为元素的一维数组。每行数组都有一个数组名例如二位数组第一行的数组的数组名就是a[0], 第一行的数组的数组名就是a[1],以此类推。 举个例子来验证可不可以这样理解 例如我们访问第二行第三个元素 我们会写成a[1][2] a[1]就是第二行的数组名数组名就是数组首元素的地址。 首元素地址再通过【2】就跳过2个元素访问第三个元素 就是第二行第三个元素。说明我们的理解是没问题的。
4.2二维数组练习
int a[3][4] {0};
printf(%d\n,sizeof(a));//1
printf(%d\n,sizeof(a[0][0]));//2
printf(%d\n,sizeof(a[0]));//3
printf(%d\n,sizeof(a[0]1));//4
printf(%d\n,sizeof(*(a[0]1)));//5
printf(%d\n,sizeof(a1));//6
printf(%d\n,sizeof(*(a1)));//7
printf(%d\n,sizeof(a[0]1));//8
printf(%d\n,sizeof(*(a[0]1)));//9
printf(%d\n,sizeof(*a));//10
printf(%d\n,sizeof(a[3]));//11printf(%d\n,sizeof(a));//1
//数组名单独放在sizeof里计算整个数组的大小
//3*4*448printf(%d\n,sizeof(a[0][0]));//2
//a[0][0]表示数组首元素大小为4字节printf(%d\n,sizeof(a[0]));//3
//第一行数组名单独放在sizeof里计算的是第一行数组的大小
//4*416字节printf(%d\n,sizeof(a[0]1));//4
//a[0]第一行数组的数组名就是第一行首元素的地址1指向第一行第二个元素
//还是指针4/8个字节printf(%d\n,sizeof(*(a[0]1)));//5
//a[0]1是第一行第二个元素的地址*解引用访问第一行第二个元素4字节printf(%d\n,sizeof(a1));//6
//a是二维数组的数组名就是数组首元素的地址就是第一行的地址
//1跳过一行指向第二行还是指针4/8字节printf(%d\n,sizeof(*(a1)));//7
//a1是第二行的地址*解引用访问第二行计算第二行的大小
//4*416字节printf(%d\n,sizeof(a[0]1));//8
//a[0]是第一行的数组名a[0]取出第一行数组的地址
//a[0]1跳过一行指向第二行还是指针
//指针大小就是4/8printf(%d\n,sizeof(*(a[0]1)));//9
//a[0]1第二行的地址*解引用访问第二行的数组计算第二行数组的大小
//4*416字节printf(%d\n,sizeof(*a));//10
//a是二维数组的数组名数组名就是数组首元素的地址就是第一行的地址
//*解引用访问第一行计算第一行的大小。4*416printf(%d\n,sizeof(a[3]));//11
//a[3]看似越界但是并未访问sizeof根据类型推断。
//所以a[3]无需真实访问根据类型推断为第四行的数组名
//数组名单独放在sizeof内部计算第四行数组的大小4*416后言 这里就是今天跟大家分享的全部内容啦今天的内容有点绕但是大家直到抓紧指针加减和数组名理解这两个点那就迎刃而解啦今天就分享到这里感谢小伙伴的耐心阅读。咱们下期见拜拜~