1.CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。
#include <stdio.h>
int main(){
int a = 100;
char str[20] = "tanyusheng";
printf("%#X, %#X\\n", &a, str);
return 0;
}
2.需要注意的是,虽然变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址。
定义指针变量的方式:
datetype *name;
datetype *name=value;
//定义普通变量
float a = 99.5, b = 10.6;
char c = \'@\', d = \'#\';
//定义指针变量
float *p1 = &a;
char *p2 = &c;
//修改指针变量的值
p1 = &b;
p2 = &d;
是一个特殊符号,表明一个变量是指针变量,定义 p1、p2 时必须带。而给 p1、p2 赋值时,因为已经知道了它是一个指针变量,就没必要多此一举再带上,后边可以像使用普通变量一样来使用指针变量。也就是说,定义指针变量时必须带,给指针变量赋值时不能带*。
4.通过指针变量取得数据
#include <stdio.h>
int main(){
int a = 15;
int *p = &a;
printf("%d, %d\\n", a, *p); //两种方式都可以输出a的值
return 0;
}
假设 a 的地址是 0X1000,p 指向 a 后,p 本身的值也会变为 0X1000,p 表示获取地址 0X1000 上的数据,也即变量 a 的值。从运行结果看,p 和 a 是等价的。
5.在不同从场景中含义不同,定义指针变量时表示这是一个只能变量,与普通变量区分开来;获取指针变量时前面加*表示获取指针所指向是数据,或者说表示指针指向数据发本身。
6.给指针变量赋地址值时不能加*号