指针 = 地址
指针变量
1.存放指针的变量
2.存放地址的变量
*(&hello); // 此时 " * "代表的是一个运算符,跟+ - / * 运算符类似, //该运算符的功能是取出内存地址中的数据的值(取内容)。
**int a =10 ; &a(0x660cffc0)**
为什么用指针” * “ 只有在定义一个指针变量的时候,才是指针的一个标识符 ,在其他情况下,都是一个取内容的运算符
- 指哪打哪——指定内存位置,给它赋值
- 经典数据交换——参数传递要用地址
指针重点c语言的指针可以做到把a(10)数据 强制保持在我要的地址 0060ff00 (在ARM架构 裸机编程 ARM 驱动)volatile int *p = (volatile int *)0x0060ff00; //强制保持在我要的地址0060ff00
1.变量访问的两种方式:
a.变量名 b.指针
2.指针
a.指向谁(类型)p=&a
b.偏移后指向谁 p++
3.整型指针只能指向整型数据,只能存放整型地址
数组指针指针变量必须初始化一个有效值才能使用
指向数组的指针
指针数组int *parray[3];
//多个指针,叫做指针数组
//数组中的每一项都是一个指针变量 指针变量是存放地址的变量
void(*p)();
数据类型 (*函数指针名)();
void printWelcome()
{
printf("欢迎来到函数指针学习课堂n");
}
int main(){
void (*p)();
p = printWelcome; //函数就是地址 ,就像数组一样,数组名就是地址
p(); //直接通过 名字( );
(*p)( ); //取内容(*指针名字) ( )
}
函数返回值为指针
#includeint s; int * sum(int x, int y); int main(){ int * r = sum(10, 9); printf("10 + 9 = %dn", *r); return 0; } int * sum(int x, int y){ s = x + y; return &s; }
函数参数为指针
void swap(int *x, int *y);
void main(){
int x = 20, y = 10;
swap(&x, &y);
printf("x = %d, y = %d", x ,y);
}
void swap(int *x, int *y){
int t;
t = *x;
*x = *y;
*y = t;
}
结构体定义指针-错误用法
#includestruct Datas { char *p; //char p = [128]; 正确用法 }; int main(){ struct Datas d; strcpy(d.p , "你今天真好看") printf("%sn",d.p); }
#includestruct Datas { char *p; }; int main(){ struct Datas d; d.p=(char *)malloc(128); memset(d.p , ' ',128); strcpy(d.p,"你今天真好看"); printf("%sn",d.p); }
#include//初始化结构体数组 struct Student { int score; char *name[128]; }; int main() { struct Student *p ; //野指针 struct Student stu1; p=(struct *)malloc(sizeof(struct Student)) // 若不用该空间应该释放掉: // free(p); p.score = 100; //会报错,如果用结构体指针,就不能用点运算符 p->score = 100; //如果用结构体指针,访问结构体中的变量 要用-> strcpy(p->name,"李四"); printf("名字:%s,分数:%dn",p->name , stu1->score); //指针是存放地址的变量,之前是指向malloc的那块空间,现在指针变量存放的是stu1的地址 p=&stu1; p++; //在内存里是偏移了整个结构体大小 }



