`

结合C中指针概念理解“java中没有指针”这句话

阅读更多

Java中没有指针的概念,并不是指针在Java中不存在,而是指针这个概念在Java中不存在,或者说Java中的指针的没有C中那样全面和强大。

Java定义类类型的变量:A a=new A();让a作为参数传递的时候,传递的同样是值,只不过这里的值不再是int作为参数时复制的一份值,而是可以创建的这个元素的一个地址的复制。这种表现同C中的指针传递其实是相同的。

C中int、char等基本数据类型,传递的是复制后的值,所以在函数中没法改变实参。C中如果用数组(int a[])作为形参,传递的是实参数组数组首元素地址的复制值。


可是Java中“指针”没有C中强大,下面介绍一些Java、C中指针的不同点,和C中指针使用的注意点:

(如果不做特殊说明,下面的a表示变量名,p表示指针名)

 

1、在C中甚至可以给函数创建指针,于是函数也可以作为另一个函数的参数。当然,诸如指针的指针等概念,都说明了C中指针的强大。

2、虽然Java中类类型的变量名称类似于指针,可是它远没有C中的指针灵活:C中int等基本数据类型都同样存在指针,C中的指针作为存储地址的一块内存,可以动态的自增自减,这就赋予其足够的灵活性。

3、可以用C中的指针来提高程序的执行效率。如在循环遍历数组中元素的时候用a[i]或者*(a+i)(这两种方法其实在C编译器里被看成是等效的),没有使用p++结合*p来的高效。

3、'*'这个符号在C中,定义指针的时候(如int *p)它是作为一种标志,而在单独使用的时候(如*p)它作为一种求值运算符号(它保证在C源程序编译阶段能通过p中存储地址将找到内容)。所以,在定义指针时直接复制必须赋给它地址(如

int a=10;int *p=&a;),而不在定义时赋值,应该这样写(int a=10;int *p;p=&a;)。

4、为便于理解,*可以看成一种运算符号(我暂时还没有搞清楚这个符号在C语言的哪个阶段被解释)。而[]等价于做变质址元素后再求值,即a[1]等价于*(a+1)。

5、a表示直接访问,*p表示间接访问。直接访问,传递的时候拷贝的是值,间接访问如果不加*,传递的将是地址。


另外,在学习C中的指针还要注意各种式子的等价关系:

1、*p等价于变量名,因为他们在编译阶段都映射到&a(p等同于&a)(这点是我猜测的,不误导大家)

2、函数中的形参使用int a[]和使用int *p是一个效果

3、对数组int a[10];  p=&a[0];等价于p=a;(a是常量,存储数组的首地址)

4、int *p=&a[0];等效于int *p;p=&a[0];

5、引用一维数组元素的时候,下标法a[i]/p[i]等效于指针法*(a+i)/*(p+i)

6、二维数组中,a[0]/*(a+0)/*a/a+0/&a[0]都表示同一个地址。

a[1]+2/&a[1][2]/*(a+1)+2也都表示同一地址。

如果要表示值,必须要*/[]出现两次,按我自己的说法,得执行两次求值运算。

7、其他的等效式子……

 

p:这篇纯属个人笔记,错误还很多。

 

  • 大小: 6.7 KB
分享到:
评论
1 楼 freewxy 2011-03-02  

相关推荐

Global site tag (gtag.js) - Google Analytics