该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
1.1 指针的三要素
数据类型 标识符
1. 凡是在程序中可以分配内存空间(除了内存管理函数 malloc calloc申请空间以外),一定是在定义变量,
定义变量一定是符合 数据类型变量名 格式
2. 如何确定变量的数据类型?
1)先确定变量名,变量名符合标识符的命名规则
2)去掉变量名,剩下的就是变量的数据类型
数据类型 [长度]--->数组类型
数据类型 *-------->指针类型
数据类型 (参数列表)----->函数类型
在数组的声明中,除了 数组名[长度] 剩下的就是数组元素的类型
在指针的声明中,除了 *指针名 剩下的就是指针指向的对象的类型
在函数的声明中,除了 函数名(参数列表) 剩下的就是函数返回值类型
3. 在复杂数据类型的定义中,带有 * [] () 符号, 将其当做运算符,根据运算符的优先级和结合性,确定标识符优先跟谁结合,那么就是谁?
标识符[长度]----->数组 , 剩下的就是数组元素的类型
*标识符 ------>指针 剩下的就是指针指向的对象的类型
标识符(参数列表)---->函数 剩下的就是函数返回值类型
char *name[20];
//优先结合,---->name[20]---->数组
//去掉 name[20] 剩下的就是数组元素的类型 char *--->指针类型
//指针数组
char (*name)[20];
// 优先结合, *name 优先结合,---->指针
//去掉 *name ,剩下的就是指针指向的对象的类型 --->char [20]---->数组类型
//数组指针
char (*name)(int);
//优先结合, *name 优先结合,---->指针
//去掉 *name ,剩下的就是指针指向的对象的类型 --->char (int)---->函数类型
//函数指针
char *name(int);
//优先结合---->name(int)----->函数
//去掉 name(int) 剩下的就是函数的返回值类型 char *------>指针
//指针函数
char name[3][4];
//优先结合:name[3]----->数组
//去掉 name[3] 剩下的就是数组元素的类型 char [4]--->数组类型
//是元素类型为数组类型的数组,---->二维数组
int fun[5]; //fun
//定义 int [5] 类型的变量 , int [5] ---> 数据类型 [长度]--->数组类型
//定义数组类型的变量 fun
char *p; //p
//表示定义 char *类型的变量p char *------>数据类型 *-------->指针类型
int test(int , int);
//test
//int (int , int)---->数据类型 (参数列表)----->函数类型
指针名:指针名--->变量名,符合标识符的命名规则
指针的类型:去掉指针名,剩下的就是指针的类型,(去掉变量名,剩下的就是变量的数据类型)
指针指向的对象的类型:在指针的声明中,除了 *指针名 以外剩下的就是指针指向的对象的类型
指针的大小固定的,由指针本身的大小决定,跟指针所指向的对象的类型无关
指针的偏移实际上由定义指针时指针指向的对象的类型决定,而不是由实际上指针指向的对象的类型决定
int main(){int a = 100; //整型变量aint *p = &a;char *pf = &a;printf("%#p\n",p);printf("%#p\n",p+1);printf("%#p\n",pf);printf("%#p\n",pf+1);return 0;}
p+1; //地址的前移
注意:
int *p; //如果指针定义在函数内容,
int main(){int *p; //指针类型的局部变量 //如果没有初始化,则系统默认赋值为随机值 //指针指向不明确//如果指针一开始只定义,不赋值,应当将指针置空//int *p = NULL; //不让指针指向任何一个地方//野指针: 指针的指向不明确,而使用指针*p = 100; //野指针。野指针会导致程序运行崩溃return 0;}