关于C语言指针
一、 引子
计算机中不同类型的数据占用字节数不用。例如:int 占用4字节,char占用1个字节。为了正确找到这些数据 必须为每个字节编上特定的号码,即地址。且每个字节的编号是唯一的。 正如CPU访问内存是我要的是地址 不是变量名和函数名。 源文件被编译和链接成可执行程序后,都能被替换成地址。
二、 指针变量
定义(语法):detatype *name =value;
例子: int p
“”表示是一个指针变量 int表示该指针变量所指向的数据的类型。
int *p /float *p 类型分别是int * float * 而不是 int型 和 float型.
赋值:
1° int a =100;
2° int *p =&a;//取a的地址
int *p =&a ;
//这两种取址方式等价
//是一个特殊符号 表明是一个指针变量 定义时必须带 *
//而给他们赋值时 因为已经知道了它是一个指针变量 就没必要再带上号了。
int *p;
p =&a;
3° 值得注意的是,p需要一个地址,在a的前面必须加一个取地址符“&”,否则是不对的。
指针变量可以多次写入:
//定义普通变量
float a =99.5, b=10.6;
char c =’@’,d=’#’;
//定义指针变量
float *p1 = &a;
char *p2 = &c;
//修改指针变量的值
p1 = &b;
p2 = &d;
地址变换:
#include <stdio.h>
int main()
{
int a=15,b=22,c=66;
int *p;
p = &a; //取a变量的地址
*p = b; //将b值赋给(*p) 即将a置为b
c = *p;//将c值置为b
return 0;
}
加了printf()后的运行结果:
这样我们通过指针就把a,b,c这3个值都赋了22了;
我们不难发现“”在不同场合下 有着不同的作用:*
1.可以用在指针变量的定义中,表明这是一个指针变量 用于和普通变亮区分开
2.**使用时在指针变量前加表示获取指针指向的数据,或者说表示的数据本身**。
3.定义指针变量的int p和使用指针变量的p的意义完全不同,int 是一种类型,而是一种符号
交换两个变量的值:
#include<stdio.h>
int main()
{
int a =100,b=99,temp;
int *pa = &a,*pb = *b;
//交换开始
temp =*pa;//将a值保存到temp
*pa = *pb;//将b值交给a
*pb = temp;//再把保存起来的a值交给b
printf(“a=%d , b=%d\n”,a,b);
return 0;
}
当然这些步骤完全能够用一个容器(变量)c来完成。而指针是间接修改的。
&p和 &pa:
&p可以理解为(&p),&p表示取变量p的地址(等价于pa),(&p)表示取这个地址上的数据(等价于pa) ;*&a 仍然等价于a;
&*pa 可以理解为&(*pa) *pa 表示取得pa指向的数据(等价于a),&(*pa)表示数据的地址(等价于&a) 所以&*pa等价于pa.