1.指针也是一种变量,占有内存控件,用来保存内存地址
2.*p操作内存
*p相当于通过地址(p变量的值)找到一块内存;然后操作内存
*p放在等号左边相当于给p所指向的内存空间复制。
*p放在等号右边相当于从p所指向的内存空间获取值。
3.指针变量和它指向的内存块是两个不同的概念
char* getStr1()
{
char* p = NULL;
p = (char*)"1234";
return p;
}
int main()
{
char* p = getStr1();
*(p + 2) = 's';//错误写法。由于"1234"存放在常量区,常量区的数据不能被修改
printf("%sn",p);
system("pause");
return 0;
4.指针也是一种数据类型,它的数据类型取决于它所指向的内存空间的数据类型。
注:指针的数据类型决定了指针的步长(p++)
5.野指针产生的原因
指针变量和它所指向的内存空间变量是两个不同的概念,使用free(p)释放指针p所指向的内存空间的时候,没有将指针变量本身置为NULL。
解决办法:在释放指针所指向的内存空间的时候同时将指针变量置空
char* p = NULL;
p = (char*)malloc(100);
strcpy(p, "123456");
printf("%sn", p);
if (p != NULL)
{
free(p);
p = NULL;//释放指针所指向的内存空间的同时将指针置为空
}
2.从一级指针到二级指针
二级指针的内存空间中保存的是一级指针的地址。二级指针的数据类型与其指向的一级指针的数据类型保持一致。可以通过二级指针来间接改变一级指针的指向。
void getMom(char **p1)
{
*p1 = (char*)400;
}
void main()
{
char* p = NULL;
char** p1 = NULL;
p =(char*)0x123;
p1 =(char**) 0x234;
printf(" p=%dn", p);
p1 = &p;//二级指针指向一级指针,p1中保存的是p的地址
printf("*p1=%dn", *p1);
*p1 = (char*)456;//通过p1间接修改p的指向
printf("p=%dn", p);//456
getMom(&p);//函数调用 需要传递一级指针的地址
printf("p=%dn", p);//400
system("pause");
}



