| |
|
开发:
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语言课堂知识小结4——指针进阶 -> 正文阅读 |
|
[C++知识库]C语言课堂知识小结4——指针进阶 |
一、知识小结: 1、数组名通常表示数组首元素的地址,但是有两个例外 ? 1) sizeof(数组名)? 这里的数组名表示整个数组,计算的是整个数组的大小。 ? 2)&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。 2、sizeof只是一个操作符,不访问括号里的内容,计算的的对象是所占内存的大小-单位是字节,返回的类型是 size_t。 3、strlen是一个库函数,计算的是字符串的长度,遇到'\0'停止。 二、指针笔试题 1、
思路:a是数组名,表示数组首元素地址,+1表示跳过一个整型,*(a+1)等价于a[1],所以*(a+1)的值是1。&a取出的是整个数组的地址,&a+1 表示跳过一整个数组,(int*)(&a+1) 表示把&a+1地址强制类型转换为整型,ptr是一个指针变量,内存中存的是(&a+1)的地址,*(ptr-1)表示对(&a+1)的地址减去四个字节后的地址解引用,结果是5。
2、
p是结构体指针,p+0x01表示p加一,向后跳过一个结构体类型的字节,20个字节,由于这里是按16进制算的,20=0x14;? 所以:0x100000+20=0x100014; p中存放的是一个地址0x100000,经过强制类型转换后,(unsigned long)p只是一个普通的无符号长整型的变量,只是一个普通的变量,没有指针的含义,所以?(unsigned long)p+1=0x100000+1=0x100001 地址p经过强制类型转换后成为一个整型的指针变量,p+1表示向后跳过一个整型变量,p+1=100004; 3、
(int*)(&a+1)表示把(&a+1)的地址强制类型转换为整型,ptr1[-1]? 等价于 *(ptr1-1)=4; (( int)a+1)? a是数组首元素的地址,int a表示把a强制类型转换为一个普通变量,+1只加一个数,接着把这个数强制类型转换为int*类型。*ptr2对该处的地址解引用,因为是整型,所以要解引用四个字节。数据存放的形式是小端,所以这个数是 02000000. %x? 是十六进制 ?4、
注意:?
int
a
[
3
][
2
]
=
{ (
0
,
1
), (
2
,
3
), (
4
,
5
) };中是,表达式,所以在数组中,只存放了1,3,5这个元素。p[0]等价于 a[0][0] =1;
5、
p是一个数组指针,p+1向后跳的是数组的大小。p[4][2]== *(*(p+4)+2) ?地址之间的加减是之间的元素个数,所以这两个值得结果是-4. -4以%d打印出还是-4 ,-4得原码是10000000?00000000?00000000?00000100 反码:111111111111111111111111111111111011 补码:111111111111111111111111111111111100 %p是专门打印地址的,所以这个值为ff ff ff f4 6、
数组a[]中,存放的是字符串的首地址,所以类型是char*。二级指针变量pa中存放的是a[]的首元素地址,p++就是(a+1),*pa =*(a+1)访问的字符串at的首地址,打印出来是at 7、
思路:数组c[]存放的是每个字符串的首地址,二级指针cp存放的是c[]中字符串的地址,三级指针存放的是数组cp的首元素地址。 第一问:**++cpp,++优先级高于* ,所以先++,在解引用。 cpp++等价于 cp++,cpp指向的是cp[]中的c+2,*cpp就是c+2,*(c+2)就是c[]中的"POINT" P 的首元素地址。打印的是字符串"POINT" 第二问:cpp 此时已经指向c+2 ,cpp++ 指向cp[]中的c+1,? c+1在--后指向的是c[]中的"E"的首地址,解引用后在+3 ,此时指向的是字符串"ENTER"中的第三个元素的地址,即E,从E开始打印,打印出的结果是ER。 第三问:*cpp[-2] 等价于 *(*(cpp-2))? cpp此时指向的是c+1,cpp-2后指向的是cp的首元素地址,即解引用后是c+3,是字符串"FIRST"的地址,+3表示指向S,从S开始打印,打印两个字符,结果是ST。 第四问:cpp[-1][-1]等价于* (*(cpp-1)-1),cpp此时还是指向的c+1,cpp-1后指向的是c+2,*(c+2-1)指向的是字符串"NEW"的首元素地址,+1是"E"的地址,从E开始打印,结果是EW。 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/11 12:30:14- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |