以下是个c指针的例子:
#include
int main(){
int *ptr;
int val=10;
ptr=&val;
int xx=*ptr;
printf("%d",xx);
}
int *ptr是声明这是个指针变量,也即说明其作用就是存储其他变量的内存地址。
&val是取其内存地址,然后赋给指针变量ptr。
*ptr这个星号的作用是取这个地址所对应的内容,最后又赋给变量xx,最后打印出xx。
不同的地方首先是这个:
int val=10,,对于c语言来说,其实是在栈里头开辟一个内存,内容是10,这块内存的名字叫做val。。。
而在python或者javascript里,如果int val=10,则是
所以在这2种语言里,val本身就是指针,它并不是对象3这块内存的名字。如果在c语言里val本身就是指针,那就没必要那么麻烦,还专门搞出一个指针的概念来。
所以在c语言里,int xx=*ptr的意思就是,在栈里开辟一块名为xx的内存,然后存储*ptr的内容10..
结论是:
因此int val=10在python或者javascript里更象两块内存之间通过某种叫引用的东西建立了联系,仍然是2个东西,而在c语言里是内存的名字去对应内存的内容,本质是1个东西。
在c语言里,只有声明过的指针变量才能存储内存地址 ,如我们上面例子看到的int val=10,int xx=*ptr,都说明普通变量都是在存储实际的内容,而只有ptr=&val在存储地址。
而python/js这样的语言则比较随意,任何一个普通变量都可以存储内存地址,因为它们都是指针。
如,一个引用变量赋值给另一个变量就是将引用变量存储的内存地址(引用变量自己就是一个指针,指向的是某一份堆内存里头的内容)复制一份给新的变量。
补充:
#include
int main(){
int foo=123;
int *ptr=&foo;
printf("%d",*ptr);
}
c语言使用指针的时候,这个星号有两重用途:
定义指针变量的时候要用星号,如int *ptr,
使用的时候要用星号来取指针变量指向的内容,如printf("%d",*ptr)