第六章指针
他来了,终于来了,要上强度了,今天我们来学指针
指针的初识 指针==地址
指针变量相关内容
指针变量要区分类型 决定了空间的大小int char;决定增量
虽然保存在不同变量类型的地址是相同的,但是空间是不同的,还有增量也是不同的
比如int是4个字节,char是1个字节
%x是无符号16进制数的格式
在十六进制数里,每两位十六进制数字组合起来代表一个字节
对于十六进制数 0x1234,在表示多字节数据时,从右往左数,右边的部分是低字节,左边的部分是高字节。也就是说,0x34 是低字节,0x12 是高字节
另外,对于 int 类型(一般占 4 个字节)的 a = 0x1234,由于 0x1234 只占了 2 个字节的有效数据,剩下的 2 个字节(即第三、四个字节)通常会被初始化为 0x00,也就是填充为 0 ,这是系统和编译器对于未使用字节的常见处理方式。
1.为什么要用指针的第一个场景:
指针作为函数参数传递
在 C 语言里,函数参数默认采用值传递。这意味着当你把变量传递给函数时,函数接收的只是变量值的副本,而非变量本身。所以,若直接传递变量,在函数内部对参数的修改不会影响到函数外部的原始变量。
但通过传递指针,函数就能获取变量的内存地址,从而可以直接访问和修改该地址处存储的实际值。在代码中,changeData 函数接收两个 int 类型的指针 pdata1 和 pdata2,这使得函数能够操作 main 函数中 data1 和 data2 变量的值。
2.为什么要用指针的第2个场景:
指针指向固定区域
指针task:
这边要记得回顾三个数对比大小需要用什么算法
数组和指针的关系例题
数组的首地址就是首个元素的地址 首地址p=&arr[0]
数组名就是首地址 首地址p=arr
指针偏移遍历数组
指针偏移的补充:
- Tips: *p++:这是一个复合操作,由于后缀 ++ 运算符的优先级高于解引用运算符 *,所以它等价于 *(p++)。先对 p 进行解引用操作,1输出 p 当前所指向元素的值,2然后 p 再向后移动一个位置。所以这个循环也会依次输出 arr[0]、arr[1] 和 arr[2] 的值。
- 由于第一个 for 循环结束后,p 已经指向数组 arr 之外的位置,为了再次遍历数组,需要让 p 重新指向数组的首地址。
一些见怪不怪的写法:数组名和指针变量可以互相替换使用
- sizeof(arr):sizeof 是 C 语言的一个运算符,用于计算数据类型或变量所占用的字节数(内存大小)。对于数组 arr,sizeof(arr) 计算的是整个数组所占用的字节数。由于 arr 是包含 3 个 int 类型元素的数组,而在常见系统中 int 类型通常占 4 个字节,所以 sizeof(arr) 的结果是 3 * 4 = 12。
- sizeof(p):p 是一个指针变量,指针变量存储的是内存地址。在 64 位操作系统中,指针通常占用 8 个字节;在 32 位操作系统中,指针通常占用 4 个字节。所以这里输出的是指针 p 占用的字节数。
- sizeof(int):计算 int 类型所占用的字节数,常见系统中结果为 4。
- sizeof(int *) 和 sizeof(char *):分别计算指向 int 类型和指向 char 类型的指针所占用的字节数。在同一操作系统中,无论指针指向何种数据类型,其占用的字节数是相同的,取决于操作系统的位数。
- sizeof计算指针大小时,计算的就是地址表示的长度,就是例如在int *存储的是0x122121则相同的在char *里面也是0x122121,由于地址都是一样的所以任何类型都是一样的值,且64位操作系统都是8个字节,32位操作系统都是4个字节。