一、指针
1、指针是什么
指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。
type *变量名 int *pNum;
例:temp 表示地址,*temp表示取该地址里的值
2、指针的作用
解决跨区域(不同作用域,不同代码块)之间的数据交互。
3、指针的初始化
定义指针变量大小的时候一定要给初值。
对指针进行初始化或赋值只能使用以下四种类型的值 :
1. 0 值常量表达式,例如,在编译时可获得 0 值的整型 const对象或字面值常量 0。
2. 类型匹配的对象的地址。
3. 另一对象末的下一地址。
4. 同类型的另一个有效指针。
把 int 型变量赋给指针是非法的,尽管此 int 型变量的值可能为 0。但允
许把数值 0 或在编译时可获得 0 值的 const 量赋给指针。
二、‘*’和‘&’
1、'*':
(1)声明/定义变量的时候 表示一个指针变量.
float b=20;
int c=10;
int *a; //定义一个指针变量 指向的内存空间只能存放整数
int *a=b; 不行,指针变量只能存地址 不能存具体值
int *a=&b 不行 整型指针只能存整型数据的地址
int *a=&c; 正确
float *d=NULL; NULL指向内存的起始地址 0x00
(2)除了定义指针变量以外,都是访问某个地址的值
int *temp=&c; //定义指针变量
*temp=21; 访问temp地址里面的数据 赋值为21;
2、‘&’ 取地址
&a 的运算结果是一个指针,指针的类型是a 的类型加个*,指针所指向的类型是a 的类型,指针所指向的地址嘛,那就是a 的地址
int a=12; int b; int *p; int **ptr;
p=&a; //&a 的结果是一个指针,类型是int*,指向的类型是 int,指向的地址是a 的地址。
*p=24; //*p 的结果,在这里它的类型是int,它所占用的地址是 p 所指向的地址,
显然,*p 就是变量a。
*ptr=&b; //*ptr 是个指针,&b 的结果也是个指针,且这两个指针的类型和所指向的类型 是一样的,所以用&b 来给*ptr 赋 值是没问题的。
**ptr=34; //*ptr 的结果是ptr 所指向的东西,在这里是一个指针,对这个指针再做一次*运 算,结果是一个int 类型的变量。
三、数组与指针
1、数组名并不是一个变量 没有分配内存空间 数组名是首地址
指针变量是有内存空间
对数组的访问可有两种方式:数组下标和指针算术。例如:
char* pChar;
char chs[100];
pChar = chs;这样pChar就指向chs数组的首地址。
2、指向数组元素的指针 支持 递增 递减 运算。
int score[5]={39,32,87,58,27};
printf("%d\n",*(score+1)); //32
printf("%d\n",*score+1); //40
printf("%d\n",(*score)++); //39
printf("%d\n",score[0]) //40
printf("%d\n",++*score) //41
四、结构体与指针
结构体指针有特殊的语法: -> 符号
如果p是一个结构体指针,则可以使用 p ->【成员】 的方法访问结构体的成员。
p->member 等价于 (*p).member。
五、指针空间的动态分配与回收
//定义一个数组 系统会分配内存空间 可以存值
Int num[10]={}
//定义一个指针变量 只为变量本身分配8个字节内存空间
无法存值,因为没有为它分配可一存值的内存空间
补:结构体大小结果要为成员中最大字节的整数倍。