为啥说C语言的精髓是指针?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥说C语言的精髓是指针?相关的知识,希望对你有一定的参考价值。

之前问过一个吉林大学计算机学院研究生毕业的同学,他是搞java研究的,我问他人家说c语言的精髓是指针,那么java有指针吗?他好像大道至简地答了句:“其实对象的本质就是指针,表现形式不同而已。”,我不知道是对是错,因为c也有对象啊,但是好像java只有对象没有指针耶,两者到底有没有指针能做到,对象不能做到的东西?

现行的所有编程语言其表达能力都是一样的,其他语言能做的另一语言都能做到,只是实现方法不一样。在所有的高级语言中只有c有指针的概念(当然c++也有,不过我们就把他看成c的超集)。java中没有像c那样的指针,这是java的内存管理机制所决定。c的指针非常灵活,程序员可以随意的修改,但也因为这一点,也使c在开发的过程中稍不注意容易照成内存的泄露,访问了不该访问的内存等。在c和其他语言比较起来,只有指针是其特有的,也因此使其更加简洁,高效,也是c目前还非常流行的原因之一。 参考技术A 指针是指向一块数据块的
class a




如果 a* temp;
temp 为4个字节
1. 如果这个对象包含有成千上万个数据,那么 a这个对象就非常大
2. 相信你知道 a1=a;把,如果是对象,把一个对象赋值给另外一个对象,那么会有很大一块内存的拷贝了,很费时间的,但是如果是指针的话,就是4个字节的拷贝了。a1* temp =&a2;
所以这就是指针的优点所在。这只是其中一点。。
参考技术B 不同语言有不同的特点,但是大家都能做到同一件事,只是方法不同罢了 参考技术C 你想知道到底C语言强大还是java语言强大吧,你的意思好像是英语能够表达的意思,汉语能否表达,答案当然是肯定的。 参考技术D java只是把指针模糊化了。。 第5个回答  2011-07-13 指针比对象灵活,用起来更加野性。当然蕴含的风险也会相应提高。

C语言中学指针时*和&是相互补充的,为啥啊?

搞不懂,求详细解释
就是说&*ptr和*&是等价的 为什么啊

参考技术A 举个例子吧 int i 和 int *p 定义一个变量 i 和 一个指针p
p=&i; 意思就是p 指向 i 因为指针是一段4字节大小的空间,里面存放着指向的目标的地址 &的意思就是取地址 也就是取i的地址存放到p里
在定义一个 int j
j=*p 意思就是 j=i *p的意思是p 解引用的意思就是引用指针指向的内容 这里也就是i
这么说明白么?
参考技术B 再地址运算中,有
*+地址==取地址的对象
&+对象==去对象的地址

这个编译器就是这么定义的,你想问题为什么一定是这两个符号吗?如果是这个我问题,我个人认为就跟英文a表示一个一样,为什么不用b呢?不过我倒是觉得@更合适替换*
参考技术C 1. 在C语言中,所有的类型都是值类型,传参也都是值传递。不要听谭浩强书上说分什么引用类型和值类型,所有的类型都有其值!

2. 指针类型也是一个值,这个值表示一个内存地址,是一个int型数据。

3. * 和 & 都是操作符。记住,他们是操作符,操作符的定义是什么?
* 表示间接引用,& 表示取址。

假设有一个变量:
int num = 4;
获取num在内存中的地址:
&num,结果是一个16进制的int数据

可以使用指针保存这个数据,如下
int *p = #

可以使用这个指针获取该内存地址存储的值
int b = *p;

这样,两个操作符之间的互相转换的关系,明白了么?就相当于乘法和除法的互相转换!

至于他们互相补充,我想应该是值内存中地址的加减法运算!
【例子】获取下一块内存地址的值
*(p+1) <=> *( &num + 1 * sizeof(int) ) 很明显使用指针写的代码少多了,方便多了!注意,此处获得的地址可能是非法的,但是可以此处忽略,不是我们讨论的重点!追问

是我没把问题说清楚 我用的是清华大学出版社的C how to program
课本中对指针讲得很不详细
这样一段程序
int a=1;
int *aPrt=&a;
printf("%p\n%p",&*aPrt,*&aPrt)
书上说输出的两行结果是一样的都是aPrt的值即a的地址 我就看不懂了 假设定义aPrt时它被分配给了3000H这个位置,a被分配给了2000H这个位置 那么*&aPrt=*(&aPrt)=*(3000H)=2000H=aPrt 可是&*aPrt=&(1),1是一个数字&如何对其操作呢?

追答

额。。。
&*aPrt = &(*aPrt) = &(a)而不是&(1)! &(a)和&(1)是两回事。这里不是简单的公式替换,你此处的1是哪来的,就是存储a的那块内存取得的,这个1是有地址的。。。。

对比下:#define a 1 此处的1是常量
此时,你再试试cout<<&a<<endl; 看看值是多少

等我周一直接给你解释上面程序的汇编代码吧~~~感觉自己没有描述到点子上,你还会有疑惑的!

本回答被提问者采纳
参考技术D 因为定义了指针变量*p后,p后就代表所指变量的地址,要把变量的地址赋值给p 就要用到&符号
定义了这许多之后,*p代表的就是地址的内容

以上是关于为啥说C语言的精髓是指针?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中学指针时*和&是相互补充的,为啥啊?

C语言回调函数学习

漫谈C语言指针

有关C语言指针的问题:为啥最后结果是空指针?

漫谈C语言指针

c语言中指针为啥被称为重型武器?