学习内容
指针
定义
类型
指向内容
运算
数组与指针
指针与函数动态分配内存
结构体
文件读写
头文件与实现文件实例之计算器
文件操作训练之字符串查找
一、指针
1.定义
- 指针是一个变量(只存地址)
- 针变量只能指向同种数据类型的地址 ,如符型指针指向字符
指针占据8*字节
示例
int main(){
int a; // 普通变量
int *pa; //指针变量 ,占据 8字节
char *pb; //字符型指针指向字符
printf("pa的大小:%d\n",sizeof(pa));
printf("pa的地址:%p\n",pa);
printf("pb的大小:%d\n",sizeof(pb));
}
输出:
pa的大小:8
pa的地址:0000000000000001
pa的大小:8
2.指针的声明
- 初始化的语法格式:数据类型 *指针变量名 =地址表达式;
- 指针变量在定义后被赋值的语法格式:
指针变量名 = 地址表达式(或“&”所获得的地址);
如:
int a;
char b;
char *c; //定义一个字符型指针c
int * pa; //定义一个整型指针
c = & b; //同一数据类型
pa = 0000000000000001;//为a的地址
注:1.声明一个指针时并不会自动分配任何内存;2.在对指针进行访问前,指针必须初始化,或是是使它指向现有的内存,或者给它分配动态内存,否则这个指针变成野指针;3.指针的初始化实际即给指针一个合法的地址,让程序能够清楚知道指针的动向,而不至变为野指针。*
二.指针的类型
- 指针类型的判断方法:去掉 *和变量名即指针类型
1.一般指针
int p ;//p是一个普通的整型变量
int *p;//p是一个返回整型数据的指针
//------p与*结合说明p是一个指针,然后与int 结合,说明指针指向的内容的类型为整型
2.数组,指针
- p与[]结合,因其优先级高于 * ,所以p是一个数组,然后再与 * 结合,说明数组里的元素是指针类型,然后再与int结合,说明指针指向的内容是整型的。
int *p[3];
p与 * 结合说明p是一个指针,然后再与[]结合说明指针指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型。
- p与 * 结合,说明p是一个指针,然后再与 * 结合,说明指针所指向元素是指针,然后再与int结合,说明该指针所指向的元素是整型数据
int **p;
- p与()结合,说明是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数,然后再与外面的int结合,说明函数的返回值是一个整型数据。
int p(int);
- p与指针结合,说明p是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int结合,说明函数有一个int型的参数,再与最外层的inbt 结合,说明函数的返回类型是整型。
int (*P)(int);
三.指针的指向内容
- 指针存储的内容为变量的地址,即指针是一个指向作用,指向变量所存储的内容
int main{
int a = 5;
int *p = &a;
return 0;
}
四.指针的运算
*指针+(-)整数
*可以对指针变量p进行p++、p--、p+i等操作,所得结果也是一个指针,只是指针所指向的内存地址相比于p所指的内存地址前进或者后退了i(对应指针指向类型对应大小)个操作数。
int main(){
char a = '1';
char *p = &a;
printf("p:%p\n",p);
p++;
printf("p++之后结果:%p\n",p);
p--;
printf("p--之后结果:%p\n",p);
p+= 5;
printf("p+5之后结果:%p\n",p);
return 0 ;
}
输出:
p:000000000062FE17
p++之后结果:000000000062FE18
p--之后结果:000000000062FE17
p+5之后结果:000000000062FE1C
注:* p是一个char类型的指针,指向内存地址0062FE17处,则p++将p相邻的下一个内存地址,由于整型数据占据4个字节,因此p++