以下是个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)