铁律1:指针是一种数据类型
1)指针也是一种变量,占有内存空间,用来保存内存地址;
指针是一种变量:
void main()
{
char *p1=NULL;
printf("p1:%d\n",sizeof(p1));
system("pause");
}//结果就是:P1:4
void main()
{
char **p2=NULL;
printf("p2:%d\n",sizeof(p2));
system("pause");
}//结果就是:P2:4
引申:
//char *p1形参,形参也是被调用该函数的参数,只不过具有对外属性
void getData(char *p1)
{
printf("getData() begin\n");
return 0;
}
//char **p2形参,
void getData2(char **p2)
{
printf("getData2() begin\n");
return 0;
}
总结:以此而言,无论是增加了几个“*”,这些数据依然是变量;
2)*p操作内存
int c=0;
int a=10;
int *p3=NULL;
a=20;//直接通过变量来修改a的值
p3=&a;//
//*p3放在=号的左边,去修改内存空间的值;
*p3=30;//通过指针间接修改内存空间的值
c=*p3;//*p3放在等号的右边从内存空间中取值
总结:
在指针声明时,*号表示所声明的变量为指针
在指针使用时,*号表示操作指针所指向的内存空间中的值。
*p相当于通过地址(P变量的值)找到一块内存,然后操作内存
*p放在等号的左边赋值(给内存赋值)
*p放在等号的右边取值(从内存获取值)
3)指针变量和它只想的内存块是两个不同的概念
引申:对于以下程序语句的理解
void senddata01(char *p1);
void senddata02(char **p1);
void senddata04(char *p[ ]);
void senddata05(char (*p)[10]);
void senddata06(char *****p4);
先站在C/C++编译器的角度去理解,无论变量前面有几个*号,只要有一个*号出现,那么,编译器就会把它作为指针来理解,并且根据数据类型为char,分配一个字节的内存。
指针的数据类型是什么?指针的数据类型是指它所指向的内存空间的数据类型。
引申:一些内存空间是不允许写入数值的:
例如:char *p=0x77;
*p=100;
运行时就会出现这样的错误:###.exe中0x00412728处有未经处理的异常:0x0000005:写入位置0x00000077时发生冲突