一.指针 int *p=&a; p=&a; *p=a; 注意:在定义时和应用时*p的含义不一样
/* 1.指针:用于存储某一个地址,从而可以通过地址直接对该地址内存空间的数据进行操作 1).是一种保存地址的变量 2).是一种数据类型 2.特点: 1).指针本身也是地址,指针定义之后自身地址不变,但是里面存的地址可以变化 2).&p--->指针自身地址 p---->表示指针存的地址 *p--->表示指针所存地址的内存空间(所存地址对应的值) 3).指针不初始化不能使用(未赋值前地址是随机的) 4).int *p[3];--->指针数组 int (*p)[3];--->数组指针 5).指针是什么类型的,就应该存什么类型的地址,否则*p取对应内存空间的值会出错 */
/* 1.指针数组:例 int *p[3];表示定义一个可以存放三个int指针的数组 赋值:int a1=1,a2=2,a3=3; int *p[3]={&a1,&a2,&a3}; 取值:int *a=p[0]; 表示一个数组,用来存放指针的数组就叫指针数组,数组里面的元素都是指针 2.数组指针:例 int (*p)[3];表示这是一个含有三个元素的int数组的指针 赋值:int arr[3]={1,2,3}; int (*p)[3]=&arr; 表示一个指针,而这个指针类型就是数组. 3.数组元素的指针 赋值:int arr[1]={1}; int *p=&arr[0]; 表示一个指针,而这个指针存的是数组一个元素的地址 */
/* 1.当c是角标为m元素的指针的时候,c[x]=arr[x+m] 2.当用指针取元素时,如果出现越界,编译器不会报错(因为指针操作的是地址) 3.当用数组角标取元素时,如果出现越界,编译器会报错 */
数组与指针的异同点 相同点: 1.二者都含有一个地址. 2.二者都能通过*变量名取值 3.二者都能通过变量名[角标]去取值. 4.二者都可以进行地址运算. 不同点: 1.二者是不同类型.数组:是构造类型 指针:指针类型 2.数组的字节长度是动态的,与类型和长度有关.而指针字节数是一致的(同一环境) 3.数组用变量名[角标]取值时越界会有警告.而指针没有. 4.数组用变量名[角标]取值时角标是谁的,就是哪个元素.但是指针是用当前地址对应的角标+当前给定的角标. 5.数组里面的地址不可以改变,而指针可以. 结论:数组具有指针的一部特性,但是它不是指针.二者是完全不同的两个数据类型
1.指针型函数:是函数,这个函数的返回值类型时指针 定义:类型 *函数名(参数){return 指针类型;} 例如:int *add(int *a){return &a;} 2.函数指针:是指针,函数也会在内存开辟一块空间,函数指针即这块空间的地址 定义:函数返回值类型 (*指针名)(参数类型); 赋值:指针名=函数名; 例如:先定义函数int add(int a){...} int (*p)(int)=add; 使用:指针名(实参);如:p(3)等效于add(3);
|