关于指针和数组的重新理解

来源:互联网 发布:2015中国加工贸易数据 编辑:程序博客网 时间:2024/05/24 22:42

指针是一个变量,变量的内容是指向的另外一个变量的地址。当然指针本身也有自己的地址,是4个字节的大小空间,我们可以通过sizeof(char*)或sizeof(int*)来检验。

对指针变量的操作,实质是对它指向的内容的操作,因为你无法通过指针指向的变量来找到引用该变量的指针。虽然这个对新手来说很难理解。我是在多次调试和编写代码之后才理解的,当然之前也因为调试结果的问题出了一些错误。因为指针是单个方向的(个人理解),这很容易理解的,一个变量可以由多个指针同时指向即引用,但通过该变量找到是谁引用的就不是c语句可以表达的了。

指向的作用是持续的,一旦指向的内容被释放掉了,那指针指向的变量就为空了,这个从指针作为参数传递形参就能很好的看到。也正因为如此,我们引用了二次指针或更多次的指针。通过指针自身地址的引用,作为参数,可以实现对指针变量本身的操作,而如果仅对指针变量进行操作,那对指针本身是没有什么影响的,因为他的指向没有变。举例吧。

int main()

{

 const char* p = “”1234;

int a = int2num("45678afdas",p);

printf("%d,&p=%s",a,p);

return 0;

}

int int2num(const char* s,const char*q)

{

int r =0;

while(isdigit(*s))

{

r=r*10+*s;s++;

}

q=s;

return r;

}

查看一下你的结果:45678,&p=1234

为什么呢,可以通过输出变量和指针本身的地址查看一下:可以看到,指针变量p本身的地址与传递的形参q本身的地址并不一样,对指针的操作其实是使用的指针的一个副本,所以,把p指针指向的变量地址传递给了q,让q去重新指向了这个变量的地址,之后对q所有的操作都发生在q身上,给q再赋值和p没有任何关系了,除非你修改了p所指向的那个变量,不过这里是不可能的,因为他是个常量,在常量存储区中是不容许修改的。所以p的内容始终不会变。

如果这样修改就大不一样了:我传递参数时加上一个&,即&p,而不是p,那传递的就是p自身的地址,所以对q的操作其实也就是对p进行操作,这里不是对指针的副本进行操作,而是对指针本身进行操作了。如果一旦有q指向的内容释放掉了,那p也变为空了。因为他实际上还是一个指向,指向的内容不存在了,他自己也没了价值。

修改为如下:

nt main()

{

 const char* p = “”1234;

int a = int2num("45678afdas",&p);

printf("%d,&p=%s",a,p);

return 0;

}

int int2num(const char* s,const char**q)

{

int r =0;

while(isdigit(*s))

{

r=r*10+*s;s++;

}

*q=s;

return r;

}

结果很明显了。


总结:指针只是一个指向,如果要实现对变量的重新赋值,要用引用,找到该变量。通过指向的内容,是找不到指针变量的。

数组:数组虽然也有地址的含义,可他跟指针不同,他有自己的存储空间。给他赋上值之后,只要数组不释放,其内容不会因为其他跟他相关变量的释放而修改。


原创粉丝点击