指针(笔记1) 二

简介: 这篇内容介绍了指针的相关概念,包括解引用操作符、指针变量的大小、指针的解引用、指针加整数以及void*指针的使用。解引用操作符允许通过指针访问和修改变量,指针变量的大小取决于地址总线的宽度(32位系统为4字节,64位系统为8字节)。指针加整数时,不同类型的指针会按相应类型大小移动。void*指针可以存储任何类型的数据地址,但不能直接解引用或进行指针运算,通常用于函数参数以实现泛型编程。最后强调了指针变量应指向相同类型的变量,并在类型不匹配时进行强制转换。

指针(笔记1) +https://developer.aliyun.com/article/1519952?spm=a2c6h.13148508.setting.14.5a334f0ex1nDUx


六、解引用操作符




上面代码就使用了解引用操作符*pa 的意思就是通过pa中存放的地址,找到指向的空间,*pa等价于a变量,即*pa==a


所以*pa=20 这个操作就是把a改成了0.


这里如果目的就是把a改成20的话,写成a= 20; 不就完了,为啥非要使用指针呢?


其实这里是把a的修改交给了pa来操作,这样对a的修改,就多了一种的途径,写代码就会更加灵活,后期慢慢就能理解



七、指针变量的大小


前面的内容我们了解到,32位机器假设有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产生的2进制序列当做一个地址,那么一个地址就是32个bit位,需要4个字节才能存储。


如果指针变量是用来存放地址的,那么指针变的大小就得是4个字节的空间才可以。


同理64位机器,假设有64根地址线,一个地址就是64个二进制位组成的二进制序列,存储起来就需要8个字节的空间,指针变量的大小就是8个字节


指针变量的大小取决于地址的大小


指针变量的大小取决于地址的大小


32位平台下地址是32个bit位(即4个字节)


64位平台下地址是64个bit位(即8个字节)




八、指针的解引用





我们可以看到,代码1会将n的4个字节全部改为0,但是代码2只是将n的第一个字节改为0。结论:指针的类型决定了对指针解引用的时候有多大的权限(一次能操作几个字节)。


比如:char*的指针解引用就只能访问一个字节,而int*的指针的解引用就能访问四个字节。


结果为:



九、指针+整数


对pa和pc加一后:



结果为:




我们可以看出,char*类型的指针变量+1跳过1个字节int*类型的指针变量+1跳过了4个字节。这就是指针变量的类型差异带来的变化。


结论:指针的类型决定了指针向前或者向后走一步有多大(距离)。

 

通过该方法我们可以将数组中的每一个元素变成1


如下:



结果为:



九、void*指针


在指针类型中有一种特殊的类型是void*类型的,可以理解为无具体类型的指针(或者叫泛型指针),这种类型的指针可以用来接受任意类型地址


但是也有局限性, void*类型的指针不能直接进行指针的+﹣整数和解引用的运算。


举例:





运行上面的代码时,将一个int类型的变量的地址赋值给一个char*类型的指针变量。编译器给出了一个警告,是因为类型不兼容。而使用void*类型就不会有这样的问题。




这里我们可以看到,void*类型的指针可以接收不同类型的地址,但是无法直接进行指针运算,比如进行解引用操作和+-整数


一般void*类型的指针是使用在函数参数的部分,用来接收不同类型数据的地址,这样的设计可以实现泛型编程的效果。


结论: 一个指针变量只能指向同类型的变量。如果给指针赋值时,=号右边的指针类型与左边的指针类型不同,则需要进行类型强制转换。


比如:


目录
相关文章
|
存储 C++
【指针笔试题的笔记】
【指针笔试题的笔记】
43 0
|
算法 编译器 C++
类与对象知识总结+封闭类+const+this指针 C++程序设计与算法笔记总结(三) 北京大学 郭炜(中)
类与对象知识总结+封闭类+const+this指针 C++程序设计与算法笔记总结(三) 北京大学 郭炜(中)
69 0
|
存储 算法 编译器
类与对象知识总结+封闭类+const+this指针 C++程序设计与算法笔记总结(三) 北京大学 郭炜(上)
类与对象知识总结+封闭类+const+this指针 C++程序设计与算法笔记总结(三) 北京大学 郭炜(上)
53 0
|
7月前
|
C++
指针(笔记2)一
本文介绍了C++中`const`关键字修饰指针的两种情况:当`const`位于星号(*)左侧时,它限制指针所指向的内容不可修改,但指针自身可变;当`const`位于星号(*)右侧时,它限制指针变量不可改变,但可通过该指针修改其指向的内容。此外,文章还讨论了指针的基本运算,包括指针加减整数(用于遍历数组),指针减指针(计算两者间元素个数)以及指针的关系运算(在循环中控制指针移动)。
45 1
|
7月前
|
人工智能 C++
指针习题笔记(较难,可用于思维锻炼)
指针习题笔记(较难,可用于思维锻炼)
36 4
|
7月前
|
程序员 编译器 C语言
指针(笔记2)二
这篇内容主要讲解了指针和野指针的概念以及如何避免野指针的问题。野指针是指针未初始化、越界访问或指向已释放内存的情况。避免野指针的方法包括初始化指针、避免指针越界和在不再使用时将指针设为NULL。此外,文章提到了`assert`断言在调试中的作用,它可以帮助检测程序运行时的错误条件。最后,讨论了函数调用中的传值调用和传址调用,指出传址调用允许函数直接修改实参变量的值。
37 0
|
7月前
|
存储 C语言 Perl
指针(笔记1)一
本文介绍了计算机内存和地址的基本概念。内存由存储单元组成,每个单元有唯一地址,内存地址是无符号整数。在32位系统中,地址空间为4GB。内存被划分为字节单元,每个变量在内存中占据特定长度的空间,例如字符占1字节,整型占4字节。指针是存储变量地址的变量,通过取地址操作符(&)获取变量的地址。指针变量需要先赋值才能使用,并且只能指向定义时的变量类型。
32 0
|
7月前
|
C语言
C语言(指针详解)重点笔记:指针易错点,都是精华
C语言(指针详解)重点笔记:指针易错点,都是精华
82 0
|
缓存 算法 安全
类与对象知识总结+封闭类+const+this指针 C++程序设计与算法笔记总结(三) 北京大学 郭炜(下)
类与对象知识总结+封闭类+const+this指针 C++程序设计与算法笔记总结(三) 北京大学 郭炜(下)
54 0
|
存储 安全 数据安全/隐私保护
骚操作:隐藏代码到数据区,函数指针【滴水逆向三期37笔记】
骚操作:隐藏代码到数据区,函数指针【滴水逆向三期37笔记】