指针(pointer),是C语言最重要,也是最复杂的概念之一,用于储存变量的地址,这里先介绍一元&运算符的用法。
一元&运算符给出变量的储存地址,如果pooh是变量名,则&pooh是变量的地址,可以把地址看作变量在内存中的位置。
pooh = 24;
printf("%d %p\n, pooh, &pooh");
将输出
24 0b46 //0b46是变量pooh的地址
指针简介
指针是一个值为内存地址的变量,正如char类型的值是字符,int类型的值为整数,指针变量的值是地址。
假设指针变量名是ptr,可以这样用。
ptr = &pooh; //将pooh的地址赋给ptr
对于这条语句,我们说ptr “指向” pooh。ptr和&pooh的区别是ptr是变量,&pooh是常量。ptr是可修改的左值,&pooh是右值,可以将ptr指向别处。
ptr = &bah; //将pooh的地址赋给ptr
解引用运算符
假设ptr指向bah,如上图。然后使用间接运算符*找出储存在bah中的值,该运算符也称为解引用运算符。注意不要和乘法运算符*混淆。
value = *ptr ; //找出ptr指向的值
上两句语句放在一起相当于:
value = bah ;
声明指针
声明指针变量时必须指定指针所指向变量的类型。因为不同的变量类型占用不同的存储空间
int * pi; //pi是指向int类型变量的指针
char * pc; //pc是指向char类型变量的指针
类型说明符表明了指针指向数据的类型,星号(*)表明声明的变量是一个指针。*和变量之间的空格可有可无,一般在声明时有空格,解引用时无空格。
pc指向的值(*pc)是char类型,那么pc本身是什么类型呢,我们描述它的类型是“指向char类型的指针”。pc的值是一个地址,在系统内部,用无符号整数表示。但指针不是整数类型,指针类型是一个新类型。
在函数形参中使用指针
形参中使用指针可以解决函数间的通信问题。
void change(int * u,int * v);
int main(void)
{
int x = 5,y = 10;
change(&x,&y); //把地址发送给函数
return 0;
}
void change(int * u,int * v);
{
int temp;
temp = *u; //temp获得u指向对象的值
*u = *v;
*v = temp;
}
程序执行后x=10,y=5。通过指针和解引用(*)运算符,该函数可以访问储存在这些位置的值并改变他们。仔细思考就可以理解。
一般而言,可以将变量的两类信息传给函数,分别是变量的值和变量的地址。
function1(x);
function2(&x);
第一种形式要求函数定义中的形式参数是一个与x类型相同的变量,第二种形式要求形参必须是一个指向正确类型的指针。
int function1(int num);
int function2(int * ptr);
如果要计算或处理值,则使用第一种形式的函数调用,如果要在被调函数中改变主调函数的变量,则使用第二种函数调用。
对本例而言,指针让exange()函数通过自己的局部变量改变main()中变量的值。
被调函数一般不会改变主调函数中的变量,如果要改变,应使用指针作为参数。如果想把更多的值传回主调函数,则必须这么做。