//数据的直接引用
int a = 10;
//定义指针数据类型/复合类型
//int* p = NULL; //p是指针类型的变量,存放指针&a
//p = &a;
//定义存放指针p的地址的指针
//int** pp = &p;
//指针是由指针的指向类型和*构成,且指向类型可以是任何C语言合法的数据类型
//printf("a=%d\n",a); //数据的读取动作就叫引用
//数据类型分析法
// int** pp; //类型为int**
// int* *pp; //类型为int*
// int **pp; //类型int
// int array[5];
// p = &array[0];
//printf("p=%p\n",p);
// p = &array[1];
//printf("p=%p\n",p+1); //指针+1代表地址往后偏移1*sizeof(指针的指向类型)
//printf("p=%p\n",p-1); //指针-1代表地址往前偏移1*sizeof(指针的指向类型)
//printf("p=%p\n",++p); //p=p+1 == ++p;
//间接引用 "*"--间址运算与
// printf("*p=%d,a=%d\n",*p,a);
// printf("pp=%p\n",pp);
//指针就是有效的内存地址
// printf("&a=%p\n",&a); //打印的是变量在内存中的首地址
// printf("&p=%p\n",&p); //打印指针变量p的首地址
// printf("sizeof(a)=%lu\n",sizeof(a));
// printf("p=&a:%p\n",p);
// printf("sizeof(p)=%lu\n",sizeof(p));
// int* const pc = &a; // -----只读指针/常量指针
// PC++ //ERROR
// *pc = 30 //将更改a空间里的数据内容
// const int* pc = &a; == const int *pc = &a; //只能读指向的内容,不能更改指向的int内容 ---常指向指针
// *pc = 30; // error
int array[5];
//int* p = &array[0];
int* p = array; //数组名里面直接保存了数组的首地址---数组名是只读的指针变量
int** pp = &p;
for (int i=0; i<5; i++) {
printf("请输入第%d的数据:",i);
scanf("%d",(*pp)++);
}
p = &array[0];
for (int i=0; i<5; i++) {
printf("array[%d]=%d\n",i,*(*pp)++);
}
return 0;
}
***********************************************************************************************************************************
无效指针:
int* p = NULL //等于 (void*)0x0 ------------>泛型指针
当指针值为null值时,不能引用null值空间的内容,若引用的话将引发段错误(段保护错误),对无效地址的间址引用都将引发段错误
lldb——————>段错误
野指针:
使用指针初始化必须为NULL,并且用完后要将这个指针赋NULL,不然将出现野指针
ptr = 0xffffffff;
swap(int a,int b) —————————>传值引用
swap(int* a, int* b) ——————————>传址引用