5.指针
5.1 指针的定义
内存区域中的每字节都对应一个编号,这个编号就是“地址”.
在程序中定义一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元.
按变量地址存取变量值的方式称为“直接访问”,如printf(""%d",i);、 scanf("%d",&i);等,
另一种存取变量值的方式称为“间接访问”,即将变量i的地址存放到另一个变量中.
在C语言中,指针变量是一种特殊的变量,它用来存放变量地址。
指针变量的定义格式如下:
基类型 *指针变量名;
例如
int *i_pointer;
指针与指针变量是两个概念,一个变量的“地址”成为该变量的“指针”
用来存放一个变量的地址(即指针)的变量,称为“指针变量”
如下图的i_pointer,在64位应用程序中,sizeof(i_pointer)=8,即占8个字节
如果考研强调程序是32位的,则寻址范围为4字节
5.2 取地址操作符与取值操作符,指针本质
取地址操作符为&,也称引用,通过&可以获取一个变量的地址值;
取值操作符为*,也称解引用,通过*可以得到一个地址对应的数据。
如下例,通过&i获取整型变量i的地址值,然后对整型指针变量p进行初始化, p中存储的是整型变量i的地址值,所以通过*p(printf 函数中的*p)就可以获取整型变量i的值. p中存储的是一个绝对地址值,
#include <stdio.h>
int main() {
int i=5;
//定义了一个指针变量,i_pointer就是指针变量名
//指针变量的初始化一定是某个变量取地址来赋值,不能随机写个数
int *i_pointer;
i_pointer=&i;
printf("i=%d\n",i); //直接访问
printf("*i_pointor=%d",*i_pointer);
return 0;
}
注意:
(1)指针变量前面的“*”表示该变量为指针型变量。
例如,float *pointer_1;
指针变量名是pointer_1 ,而不是*pointer_1.
(2)在定义指针变量时必须指定其类型。只有整型变量的地址才能放到指向整型变量的指针变量中。例如,下面的赋值是错误的:
float a;
int * pointer_1;
pointer_1=&a;//毫无意义而且会出错
(3)如果已执行了语句
pointer_1=&a; 那&*pointer_1与&a相同,都表示变量a的地址,即pointer_1
即虽然”&“和”*“两个运算符的优先级相同,但是要按自右向左的方向结合*&a表示,先进行&a的运算,得到a的地址,在进行*运算,*&a和*pointer_1的作用一样,都等价于变量a,即*&a与a等价
int *a,b,c;表示声明了一个指针变量,两个int变量
要声明三个指针变量需要写成int *a,*b,*c;
指针的使用场景只有两个,即传递和偏移
5.3 指针的传递
#include <stdio.h>
void change(int *j){ //j是形参
*j=5;
}
int main() {
int i=10;
printf("before value i=%d\n",i);
change(&i);
printf("after value i=%d\n",i);
//在子函数内去改变主函数的某个变量值
return 0;
}