IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 指针强化练习,让你彻底征服指针【c语言】 -> 正文阅读

[C++知识库]指针强化练习,让你彻底征服指针【c语言】

一维数组

sizeof(数组名) - 数组名表示整个数组的-计算的是整个数组的大小
&数组名 - 数组名表示整个数组,取出的是整个数组的地址

除此之外,所有的数组名都是数组首元素的地址

int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));  //1
printf("%d\n",sizeof(a+0)); //2
printf("%d\n",sizeof(*a)); //3
printf("%d\n",sizeof(a+1)); //4
printf("%d\n",sizeof(a[1])); //5
printf("%d\n",sizeof(&a)); // 6
printf("%d\n",sizeof(*&a));//7
printf("%d\n",sizeof(&a+1)); //8
printf("%d\n",sizeof(&a[0]));//9
printf("%d\n",sizeof(&a[0]+1));//10

1 数组单独放在sizeof 中 计算的是整个数组的大小 a 数组有四个元素 每个元素四个字节 所以计算的结果是16


2 a+0是第一个元素的地址 ,sizeof(a +0 ) 计算的是地址的大小, 所以结果是4/8 【32位平台是4 ,64位平台是8】
在这里插入图片描述


3 *a 是数组第一个元素 ,sizeof(*a)计算的是第一个元素的大小,第一个元素的类型是int ,所以结果是4
在这里插入图片描述


4 a +1 是第二个元素的地址 ,sizeof(a+1)计算的是地址的大小 ,所以结果是4/8
在这里插入图片描述


5 a[1] 计算的是第一个元素的大小 ,第一个元素的类型是int ,所以结果是 4 在这里插入图片描述


6 &a 虽然是数组的地址 ,但是也是地址 ,sizeof(&a) 计算的是地址的大小
所以结果是4/8在这里插入图片描述


7 sizeof (* &a) 计算的是数组的大小 ,其实就是int(*p)[4] = &a 但是这里需要一个能够指向数组的指针 ,存放数组的地址 。 将整个数组解引用, 得到的是整个数组的内容 。数组每个元素类型是int ,所以结果是16
在这里插入图片描述

8 &a+1 数组后面空间的地址。 &a 取出整个数组的地址 ,放在数组指针中(int(*p)[4] = &a)。+1 跳过一个数组指针
在这里插入图片描述


9 &a[0] 取出的是第一个元素的地址 ,所以结果是4/8
在这里插入图片描述


10 &a[0] + 1 ,取出的是第二个元素的地址 ,所以结果是4/8
在这里插入图片描述

字符数组

sizeof 是操作符 ,‘\0’参与计算长度
strlen是函数 以’\0’ 作为结束标志 ,但是’ \0 '不参与计算长度

	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));   //1 
	printf("%d\n", sizeof(arr + 0)); //2
	printf("%d\n", sizeof(*arr)); //3 
	printf("%d\n", sizeof(arr[1]));//4 
	printf("%d\n", sizeof(&arr)); //5
	printf("%d\n", sizeof(&arr + 1)); //6
	printf("%d\n", sizeof(&arr[0] + 1)); //7

	printf("%d\n", strlen(arr));  //8
	printf("%d\n", strlen(arr + 0)); //9
	printf("%d\n", strlen(*arr));//10
	printf("%d\n", strlen(arr[1])); //11
	printf("%d\n", strlen(&arr)); //12
	printf("%d\n", strlen(&arr + 1)); //13
	printf("%d\n", strlen(&arr[0] + 1)); //14

1 sizeof(arr)计算整个数组的大小 ,数组每个元素类型是char 所以结果是6


2 size(arr+0) 数组名表示首元素地址 ,地址的大小是4/8
在这里插入图片描述


3 sizeof(*arr) 数组名表示首元素地址 ,对 'a’进行解引用 ,找到a元素 ,a的类型是char 所以结果就是1
在这里插入图片描述


4 arr[0] 找到a元素 ,a的类型是char 所以结果就是1
在这里插入图片描述


5 sizeof(&arr) ,字符数组的地址也是地址 ,地址的大小是4/8


6 sizeof(&arr +1 ) ,&arr取出的是整个字符数组的地址 ,+1 跳过整个字符数组在这里插入图片描述


7 sizeof(arr[0] +1) , 取出的第一个元素的地址 , 它的类型本质上是char * , +1 跳过一个元素 ,指向b , 所以结果是4/8
在这里插入图片描述


8 数组名表示首元素地址 ,strlen 会一直往下读 ,直到找到’ \0’为止 , 但是我们并不知道’\0’在内存中什么位置 , 所以结果就是随机值
在这里插入图片描述


9 数组名表示首元素地址 ,arr+0还是指向a的地址 ,所以结果是随机值
在这里插入图片描述


10 找到a的地址,解引用找到a元素 ,把字符a的ASCII值97当成地址,以ASCII值97为地址去找字符串 , 是找不到的 所以这个代码是错误的
在这里插入图片描述


11 arr[1]表示字符’b’,b的ASCII值是98 , 98作为地址也有问题 ,所以这个代码是错误的
在这里插入图片描述


12 strlen (&ar) 取出字符数组的地址 ,放到一个字符数组指针, char (*p)[6]=&arr 这里发生了类型转换,值没有变化, 地址传给str时,类型发生了变化
从char (*p)[6] 变为char * 即使是传过来的是数组的地址 ,站在strlen角度上 ,仍然认为是字符串首字符的地址 ,strlen 向后找’\0’ , 所以结果是随机值
在这里插入图片描述


13 strlen (&arr+1) , char (*p)[6]=&arr ,把字符数组的地址放在数组指针中 , 所以+1跳过一个字符数组 , strlen并不知道’\0’在内存中的位置 ,所以结果是随机值
在这里插入图片描述


14 &b的地址 向后找’\0’ ,结果是随机值
在这里插入图片描述


   char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));  //1
	printf("%d\n", sizeof(arr + 0)); //2
	printf("%d\n", sizeof(*arr));//3
	printf("%d\n", sizeof(arr[1])); //4
	printf("%d\n", sizeof(&arr)); //5
	printf("%d\n", sizeof(&arr + 1)); //6
	printf("%d\n", sizeof(&arr[0] + 1)); //7

	printf("%d\n", strlen(arr)); //8
	printf("%d\n", strlen(arr + 0)); //9
	printf("%d\n", strlen(*arr)); //10
	printf("%d\n", strlen(arr[1])); //11
	printf("%d\n", strlen(&arr)); //12
	printf("%d\n", strlen(&arr + 1)); //13
	printf("%d\n", strlen(&arr[0] + 1)); //14

1 sizeof(arr) 计算整个数组 数组7个元素 ,每个元素类型是int 所以结果是7


2 sizeof(arr+0) 表示a的地址 , 所以结果是4/8
在这里插入图片描述


3 sizeof(*arr) 表示a元素 , a元素的类型是char,所以结果是1
在这里插入图片描述


4 sizeof (arr[1] ) 表示 第二个元素 b ,b元素的类型是char,所以结果是1
在这里插入图片描述


5 sizeof (&arr) ,取出整个数组的地址 , char (*p) [7] =&arr ,但是整个数组的地址也是地址,所以是4/8


6 sizeof(&arr+1) ,char (*p) [7] =&arr ,+1 跳过7个字符的数组,所以是4/8


7 sizeof(&arr[0] +1) 表示第二个元素的地址,所以是4/8
在这里插入图片描述


8 strlen (arr) 以’\0’ 作为结束标志 , ‘\0’ 前面有6个字符 ,所以结果是6


9 strlen(arr) 数组名表示首元素地址 , 所以结果是6
在这里插入图片描述


10 strlen(*arr) 表示a元素 , 把a的ASCII值传过去 ,这是错误的代码
在这里插入图片描述


11 表示b元素的 , 把b的ASCII值传过去 ,这是错误的代码
在这里插入图片描述


12 strlen(&arr) 取出整个数组的地址 , char (*p) [7] =&arr , 向后找’\0’ ,所以结果是6
在这里插入图片描述


13 strlen(&arr+1) &arr取出整个数组的地址 , char (*p) [7] =&arr ,+1 跳过整个数组,但是后面有没有’\0’ ,strlen并不知道 .所以是随机值
在这里插入图片描述


14 strlen(&arr[0]+1) ,所以结果是5
在这里插入图片描述


字符指针

	char* p = "abcdef";
	printf("%d\n", sizeof(p)); //1
	printf("%d\n", sizeof(p + 1)); //2
	printf("%d\n", sizeof(*p)); //3
	printf("%d\n", sizeof(p[0])); //4
	printf("%d\n", sizeof(&p));  //5
	printf("%d\n", sizeof(&p + 1)); //6
	printf("%d\n", sizeof(&p[0] + 1));  //7

	printf("%d\n", strlen(p));  //8
	printf("%d\n", strlen(p + 1));// 9
	printf("%d\n", strlen(*p)); //10
	printf("%d\n", strlen(p[0]));  //11
	printf("%d\n", strlen(&p)); //12
	printf("%d\n", strlen(&p + 1));  //13
	printf("%d\n", strlen(&p[0] + 1));  //14

1 p指向的是a的地址 ,sizeof§,计算的是一个指针变量的大小 ,虽然是字符指针,也是指针 ,指针的大小是4/8
在这里插入图片描述


2 sizeof(p+1) p+1 指向b的地址 ,b的地址也是地址 ,所以是4/8
在这里插入图片描述


3 sizeof(*p) ,p指向a的地址, *p 拿到的是a元素
在这里插入图片描述


4 p[0] 等价于*( p+0) ,找到的就是a元素
在这里插入图片描述


5 &p ,取出p的地址 ,p的地址也是地址 , 所以结果是4/8
在这里插入图片描述


6 &p +1 ,跳过一个p ,所以结果是4/8
在这里插入图片描述


7 &p[0]+1 p[0] 是a元素 , &p[0] 就是取出a的地址 ,+1 指向b的地址,b的地址也是地址 , 所以结果是4/8
在这里插入图片描述


8 p指向a的地址 ,strlen 向后寻找\0 才会停止 ,所以结果是6
在这里插入图片描述


9 p指向a的地址 ,p+1 就指向b的地址 ,所以结果是5
在这里插入图片描述


10 *p 找到的是a ,代码错误
在这里插入图片描述


11 p[0] 就等价于*(p+0) ,找到a元素 ,代码错误
在这里插入图片描述


12 &p ,取出p指针的地址 ,但是里面是否有\0 , strlen 并不清楚 ,所以是随机值
在这里插入图片描述


13 &p+1 结果是随机值
在这里插入图片描述


14 &p[0]+1 ,指向b的地址 ,所以结果是5
在这里插入图片描述


二位数组

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(a+1)); //6
printf("%d\n",sizeof(*(a+1))); //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]));//11

1 sizeof(a) 计算整个数组 ,数组有12个元素 ,每个元素的类型是int ,所以结果是48


2 a[0][0]是第一行第一个元素 ,sizeof计算第一行第一个元素所占空间的大小 ,类型是int ,所以结果是4


3 a [0] 可以理解为第一行的数组名 ,此时是数组a[0]单独放在sizeof内部 , a[0] 表示整个的第一行 ,sizeof(a[0])计算的就是第一行的大小 所以结果是16
在这里插入图片描述


4
a[0]作为数组名并没有单独放在sizeof内部,也没取地址, 所以a[0]就是第一行第一个算的地址 a[0]+1,就是第一行第二个元素的地址 ,所以结果是4/8
在这里插入图片描述


5
拿到第一行第二个元素 ,第一行第二个元素的类型是int ,所以结果就是4
在这里插入图片描述


6
数组名表示首元素地址,二维数组的首元素地址是第一行 ,a+1表示第二行的地址 ,所以结果就是4/8
在这里插入图片描述


7
a+1是第二行的地址,所以*(a+1)表示第二行 所以计算的就是第2行的大小 ,每个元素类型是Int ,所以结果是16
在这里插入图片描述


8
a[0]是第一行的数组名,&a[0]取出的就是第一行的地址,&a[0]+1 就是第二行的地址
所以结果是4/8
在这里插入图片描述


9&a[0]+1 就是第二行的地址,*(&a[0]+1) 就是第二行,每个元素类型是int 所以结果是16
在这里插入图片描述


10 a就是首元素的地址,即第一行的地址,所以*a就是第一行,计算的是第一行的大小
所以结果是16
在这里插入图片描述


11
a[3]其实是第四行的数组名(如果有的话),所以其实不存在,也能通过类型计算大小的
所以结果是16
在这里插入图片描述


如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注
你们的每一次支持都将转化为我前进的动力!!!

在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 10:47:31  更:2022-12-25 10:47:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 6:04:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码