一、什么是指针? 指针变量是用来存放内存地址的变量。不同类型存放不同类型的地址。 二、为什么要用指针? **1.**指哪里打哪里。 **2.**可以强行安排固定某地址放数据。
------volatile int *p = (volatile)(int *)0x0060ff00 ------*p = 10; ------printf("在内存%p中存放了%d\n",p,*p); 在 0x0060ff00地址 存放了一个10.****注:volatile------类型修饰符 作用是每次访问都是去访问内存 而不是走寄存器 虽然牺牲了效率,但是准确性更高,风险更低。 **3.**可以更准确的修改数据,通过地址修改才是真正的给原数据进行了修改。 传递(参数)要用指针,例如经典数据交换。 指针有: 指针数组 数组指针 函数指针 无类型指针 指针数组
指针的数组 好多个指针放在一起的数组,叫指针数组。 多个指针,叫做指针数组,数组的每一项都是一个指针变量,都是存放地址的。 基本定义:
int *p[3]; int a = 1; int b = 2; int c = 3; p[0] = &a; p[1] = &b; p[2] = &c; *数组的指针 一个数组一个指针。 基本定义:int (p)[3]; int a[3]; p = &a; //赋值 注:偏移量问题:偏移是整个数组的大小!!! 整形int 是四个字节,偏移为34=12(字节)这个数组指针偏移量为12个字节。
函数指针是专用的,对格式要求很强 得返回值 参数类型 个数都一致。 怎么定义:void (*p)(); 赋值:p = 函数名; 调用:p(); 或者 (*p)();
int add(int a,int b) { return a+b; } int main() { int (*p)(int a,int b);//定义一个函数指针 p = add; //给函数指针赋值 int sum = p(1,2); //调用函数指针 printf("sum = %d\n",sum); //输出结果 }无类型指针就是 void* 类型指针,一个指针变量,有返回值的,只是返回值是无类型的。 可以指向任意类型的数据。 使用例子
int *p = (int *)malloc(3*sizeof(int)); //定义了一个指针p 给它开辟了3*4=12字节的空间,并且强转为int* 型。** int n; int i; printf("请输入成绩个数\n"); scanf("%d",&n); for(i=0;i<n;i++) { printf("请输入第%d个学生成绩\n",&(i+1)); scanf("%d",&p[i]); } for(i=0;i<n;i++) { printf("第%d个学生成绩是%d\n",i+1,*p++); }