//#用指针注意两点。1.初始化 2、空指针、野指针和void 型指针
/*不能出现野指针,可以出现空指针和void 型指针,空指针不能访问。
void 型指针只有通过强制类型转换后才可以访问,否则也不能访问 */
#include<stdio.h>
int main(void){
int i;
int *pi=&i;//表示定义一个指向int型的变量指针pi,并用i的地址(为一常数)来初始化pi
/*虽然pi的地址跟pc一样,但*pc只能访问一个字节,*pi可以访问到4个字节*/
char c;
char *pc=&c;
/* 注意pi和pc最好不要相互赋值,或者通过强制类型转换pi=(int *)pc;这样做不可取,
虽然pi的地址跟pc一样,但*pc只能访问一个字节,而*pi访问的是四个字节 */
//如果写成pi=i就不行,因为i不是常量表达式。全局变量只能用常量表达式。
//后面两行代码定义了一个字符型变量c和一个指向C的字符型指针pc,注意pi和pc虽然是不同
//类型的指针变量,但它们内存单元都占4个单元,因为要保存32位的虚拟地址。
int j=10;
pi=&j;
*pi=*pi+10;
printf("%d,%d\n",*pi,j);//结果为20,20
/*通过指针pi间接寻址变量j,把变量j的值增加10;也就是说*pi发生变化,j的值也就发生变化。
根据指针找到变量,称为Deference。 */
/*----------------------------------
如果上述i是一个指针变量,即
int *i=100;//这个就相当于int *i;i=100;
然后有
int *pri=i;
或者
int *pri;
pri=i;
printf("%d,%d\n",pri,i);//打印结果为100,100
则表示i指向哪,pri就指向哪。
如果改成
printf("%d,%d\n",*pri,*i);
//则编译错误,*pri未初识化,属于野指针。
-----------------------------------*/
return 0;
}
/*----------------------------------------
有一种情况需要特别注意的是
定义一个指针类型的局部变量而没有初始化
----------------------------------------
int main(){
int *p;
.......
*p=0;
}
-----------------------------------------
在栈上分配的变量初始值是不确定的,也就是说
指针p指向的内存地址是不确定的,后面用*p访
问不确定的地址会导致不确定的后果,可能引发
段错误,也可能意外导致程序指向不确定的地址
称为“野指针”,为避免出现野指针,在定义指
针变量就应该明确地给它赋初值或者初识成Null;
Null在C标准库的头文件stddef.h中定义为
#define((void *)0)
int *p=Null;//这样写把p变为空指针,空指针不
允许访问。即使通过强制类型转换。
空指针定义:把整型的0强制转换为void *指针,
这个指针指向0地址。
操作系统不会把任何数据保存在地址0及其附近,
也不会0~0xfff页面映射到物理内存,所以任何对
0地址的访问(比如*p=0;)一定会引发段错误(编译
能通过)。
。
-------------------------------------------*/
/*----------------------------------------
由于指针是标量类型,因此可以作为逻辑与、或、非
运算和if、for、while的控制表达式
if(p) A;
else B;
意思是指针p非空则执行语句A,如果指针是空指针,
则执行语句B。
void *可以定义指针,但void不能定义变量
void *指针不能直接Dereference,而必须先强制转换。
因为不能访问,下面这段代码不能通过。
-----------------------------------------------
#include<stdio.h>
int main(){
int i;
void *p;
p=&i;
printf("%d,%d\n",*p,i);
return 0;
}
-----------------------------------------------
强制转换后写成
-----------------------------------------------
#include<stdio.h>
int main(){
int i=23;
int *j;
void *p;
p=&i;
j=(int *)p;
i=i-6;
*j=*j+10;
printf("%d,%d\n",*j,i);//打印结果为27,27
return 0;
}
}
-------------------------------------------*/
笔记摘自《Linux C 编程 一站式学习》.宋劲杉 编著