开始复习和进阶C指针,
本文主要内容参考:https://labspc.gitbook.io/cnippets/chap5.-zhi-zhen-yu-shu-zu
《C指针编程之道》ISBN 9787115250841
1. 指针变量的大小
指针变量存的是什么?存的是一个地址,所以说你给指针变量指定了类型,但是根本不影响,它本身只是一个地址,它的大小和你这个指定的类型的大小是没有关系的。指针变量的大小和机器的位数是有关系的, 指针即地址,32位机、64位机,就是说这个地址是32比特位、64个比特位,x64平台下,指针变量的大小,就是64个比特位,也就是8字节。
注意:指针是常量,因为是地址;指针变量是变量,二者概念不同。
2. 指针变量的定义与赋值
2.1 定义
datatype *pointer_name;
其中,datatype
是指针所指向的数据类型,pointer_name
是指针变量的名称。例如,如果你想定义一个指向整数的指针变量,可以这样写:
int *ptr;
2.2 赋值
int num = 10;
int *ptr;
ptr = # // 将ptr指向num的地址
指针变量仅能存放某个地址,可以取址,但是不能直接指定值。
注意:我们要清楚,指针变量存的是地址,取出来的也是地址。
此外,可以初始化为 0,空指针,不指向任何东西。
int *ptr = 0;
int *ptr = NULL;
2.3 取值与取址
- 取值 (Dereferencing):
- 英文:Dereferencing
- 意义:取得指针所指向的值
- 用法:使用解引用运算符
*
来执行 - 示例:如果
ptr
是一个指向整数的指针,那么*ptr
表达式将取得指针ptr
所指向的整数值。
- 取址 (Address-of):
- 英文:Address-of
- 意义:取得变量的地址
- 用法:使用取址运算符
&
来执行 - 示例:如果
num
是一个整数变量,那么&num
表达式将取得变量num
在内存中的地址。
如果要说取值*
的话,解引用运算符 *
是用来访问指针所指向的值的。换句话说,当你有一个指针指向某个内存地址时,使用 *
可以获取该内存地址上存储的值。 来看代码:
int num;
int *pnum;
punm=#
*punm=5;
第4句*pnum
解引用了指针 pnum
,获取了它所指向的值,也就是变量 num
的值。用解引用运算符 *
完成间接访问变量num,并完成赋值。
注意:不要问为什么,写法就是这么个写法。我第一次学的时候也想问为什么,不要问为什么,我们就是在学规则,学用法。
3. 指针辨析:(&*p)
和 (*&p)
的区别
通过这个例子,可以知道p
本身存的值就是一个地址,而p
本身在内存中也有自己的地址,因为此时的p
是变量。
而后,再来看(&*p)
和 (*&p)
二者的区别,只要记住是“右结合”的就行。
#include <stdio.h>
int main() {
int i = 10;
int *p = &i;
printf("Value of p: %p\n", p);
printf("Address of p: %p\n", &p);
printf("Address of i: %p\n", &i);
printf("\n(&*p) = %p\n", (&*p));
printf("(*&p) = %p\n", (*&p));
return 0;
}
笔记:这里,本地调试一下,仔细琢磨输出,理解下指针、指针变量、指针变量的值、指针变量的地址等细节。
4. 地址运算
C语言支持 3 种格式的指针算术运算:
- 指针加上整数
- 指针减去整数
前两种就是指针的移动:
p=&a[2];
q=p+3;
- 两个指针相减
#include <stdio.h>
#include <stddef.h>
int main() {
int arr[] = {1, 2, 3, 4, 5};
int *ptr1 = arr; //指向首元素 1
int *ptr2 = &arr[3]; //指向第4个元素 4
// 计算指针之间的偏移量
ptrdiff_t diff = ptr2 - ptr1;
printf("指针之间的偏移量为:%td\n", diff);
return 0;
}
/*
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ ptrdiff_t 是C语言标准库 <stddef.h> 中定义的一个整数类型,用于存储指针之间的偏移量。 │
│ 在上面的示例中,我们使用 %td 格式说明符来打印 ptrdiff_t 类型的值。
| OUTPUT:
| 指针之间的偏移量为:3 │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
*/
下图见动态演示:
暂无评论