int num = 1; 会申请4个字节的内存来存放数字1,每次访问 num 就是访问这4个字节。
访问内存中的这4个字节,不仅可以通过名称(例如 num),还可以通过地址。 Tip:& 不仅是位运算符,还是取地址操作符。例如 int* ptr = #,就是取变量 num 的地址并将其保存到指针变量 ptr 中
请看示例:
#include <stdio.h>
int main() {
int num = 10;
// num 的地址:0x7fff4dbf01d8
printf("num 的地址:%p\n", &num);
// num 的地址加1 :0x7fff4dbf01dc。
printf("num 的地址加1 :%p\n", &num + 1);
// j 存放连续内存的第一个字节地址
int *j = #
// 10。通过地址访问
printf("%d", *j);
return 0;
}
复制代码
&num 和 &num + 1 相差4个字节,说明 &num 表示整数。
普通变量存放值,而指针用于存放地址。
通过 int *j = &num 将变量num的首地址给到指针 j(j的类型是 int *),最后通过地址(*j) 访问整数1。
int *j 是一个int类型的指针,还有 char、float等指针类型。指针类型必须匹配,比如将 j 的指针类型换成 char,则会警告。就像这样:
- int *j = #
+ char *j = #
复制代码
运行:
/workspace/CProject-test/main.c:12:11: warning: incompatible pointer types initializing 'char *' with an expression of type 'int *' [-Wincompatible-pointer-types]
char *j = #
^ ~~~~
1 warning generated.
num 的地址:0x7ffddcfe5328
num 的地址加1 :0x7ffddcfe532c
10
复制代码
Tip: 指针 j 也有地址,也就是指针的指针。现在不研究
练习
题目:请问输出什么?
#include <stdio.h>
int main() {
int num = 10;
int *p = #
printf("用指针访问数据 num :%d\n", *p);
*p = 11;
printf("用过指针修改 num 数据:%d\n", num);
return 0;
}
复制代码
提示:数据可以通过变量访问,也能使用地址(指针)访问。就像通知同学去嵌入式实验室上课,或者是 303 上课。其中*p = 11; 等价于 num = 11;
输出: