微信号:programmer_club

介绍:程序员第一自媒体,与你探讨码农人生路上遇到的各类泛技术话题,定期为你推荐码农人生思考、感悟以及启迪!

为什么C/C++语言使用指针

2016-06-10 22:01 程序哥



来自:快课网
链接:
http://www.cricode.com/3546.html


这是参加面试时,面试官问的一道开放性题目。

问题是:为什么C/C++语言使用指针?

这个问题一问出来,直接被面试官秒杀了,面试官大神,你怎么不按套路出牌啊?

说好的malloc和new的区别呢?说好的const和#define有什么优缺点呢?说好的进程和线程有什么区别和联系呢?说好的进程间通信有哪些方式呢?说好的%¥%#……@……*&()#!@#*……“……#%#%#呢?

说好的这些面试题,统统都没有。一上来就来这么一个问题。加上本身语言表达能力不够好,当时的心情就是这样的:不淡定中带点伤感!

说好的奥斯卡影帝呢?

现在想想,这个问题就是一个大坑。

首先,这个题目理解起来就有点猫腻。言外之意好像是想让你说C/C++中有指针,而C#或者Java等语言中没有指针。将这些编程语言做一下对比。

假装沉思了3秒钟,然后我就想当然的,顺着这么个思路,就开始顺口开河了。C#是高级语言,没有指针啥啥的就开始了。反反复复那么几句话,怎么扯也扯不出个清晰的逻辑出来。说出来的答案连自己都觉得是bullshit。

现在回头想想,当时的理解和答案是大错特错了。这本身就就是一个错误的问题。或者说,面试官就是故意将你往沟里带,等着你中套。

答案是:每一种编程语言都使用指针。不止C/C++使用指针。

为什么这样说?

因为后来在网上搜索答案时,在Quora上找到了一些大神们的解答。

 “Everything uses pointers. C++ just exposes them rather than hiding them,” 

 It’s easier to give someone an address to your home than to give a copy of your home to everyone.

每一种编程语言都使用指针。C++只是将指针暴露给了用户(程序员),而Java和C#等语言择是将指针给隐藏起来了。

但糟糕的是,有些语言试着将指针隐藏起来,却露出了尾巴,有时候让人非常费解。

下面是30年老程序员Marcus Geduld举的栗子。引用如下:

Take, for instance, Javascript:

function foo( bar ) {
bar++;
}

var x = 5;

foo( x );

console.log( x );

Now, what is the value of x at then end of this code? 5 or 6?

Even though, in the function, the value of x gets assigned to bar and then incremented from 5 to 6, the log statement at the end will print 5. Why? because x’s value will be copied in to the function. In other words, bar won’t be pointing at the value of x, even though I wrote foo( x ). It will be pointing at a copy of that value.

Now, let’s say I wrote this:

function foo2( anArray ) {
anArray[ 0 ]++;
}

var myArray = [ 10, 20, 30 ];

foo2( myArray );

console.log( myArray );

In this case, the log will read [ 11, 20, 30 ]. So in the first case, the value was untouched. In this case, it’s been changed. Why, because foo2 didn’t get passed a copy of a value. Rather, it got passed a pointer—to the same array that myArray pointed to. So, in the first case, x and bar pointed to different values, whereas in the second case, myArray and anArray pointe to the same value, a pointer to [10, 20, 30 ].

Put more simply, this is a variable set to a value …

var a = 10;

Whereas this is a variable set to a pointer:

var a = [ 10 ];

But since nothing makes this explicit, you just have to learn some weird rules. And since many beginners don’t, they get hopelessly muddled. And they wind up accidentally changing values they didn’t intend to change and accidentallynot-changing values they did intend to change. Ugh!

Just in case this is unclear, compare this …

function foo( bar ) { bar++; console.log( bar ) };
var x = 5;
foo( x );
console.log( x );

output:
6
5

… with this :

function foo2( bar ) { bar[ 0 ]++; console.log( bar[ 0 ] ); }
var x = [ 5 ];
foo2( x );
console.log( x[ 0 ] );

output:
6
6

WARNING:面试时要时刻保持头脑的清醒,淡定,千万不要被面试官给引到沟里去了!

程序员之家

programmer_club


▲长按二维码“识别”关注

中食养

zyslyswx

▲长按二维码“识别”关注

关注亮点:年少不养生,老来养医生。最好的医生是自己,最好的医院是厨房,最好的药物是饮食,最好的疗效是坚持。

发型社

faxingshevip

 

▲长按二维码“识别”关注

关注亮点你的发型不好看,不是你的错,是你没有认识社长大人。 你认识社长大了,你的发型还是不好看,那是社长的错。

程序员之家

programmer_club

▲长按二维码“识别”关注

关注亮点程序员第一自媒体,与你探讨码农人生路上遇到的各类泛技术话题,定期为你推荐码农人生思考、感悟以及启迪!

自由企业家语录

ziyouqiyejialuyu


▲长按二维码“识别”关注

关注亮点:传递正能量,构建人生精彩;助人助己,自助者天助!

发型时尚

zuishishangweixin


▲长按二维码“识别”关注

关注亮点:你的发型我负责,想要更美丽,来这里看看!

全球意外视频

BXZGZJSH


▲长按二维码“识别”关注

关注亮点意外、突发、一网打尽

微短片

DPDP88


▲长按二维码“识别”关注

关注亮点全球最热视频短片!一网打尽!

糗事总汇

GJBLJT


▲长按二维码“识别”关注

关注亮点骚年,来吧!你懂的。

重庆重庆人 

CQCQRR


▲长按二维码“识别”关注

关注亮点:重庆的那些人儿,那些事儿!

全球搞笑排行榜V

ZGZYTX


▲长按二维码“识别”关注

关注亮点:全球搞笑视频集锦,天天有乐子!

全球搞笑排行榜

QQgaoxiaoTV


▲长按二维码“识别”关注

关注亮点:每周六晚19:00准时更新

 
程序员之家 更多文章 你知道你的电脑 1 秒钟能做多少事情吗? 从《守望先锋》浅谈游戏外挂 乔布斯的老东家,美国游戏机时代的终结者! 来!我们赌一把! 内存太小,怪我啰!
猜您喜欢 黑帽网三周年免费邀请码发放! 南京的java开发兄弟们关注下哈 5种实用的移动手机APP导航菜单设计方案 程序员如何写出杀手级的简历 R语言机器学习:老司机和你聊聊算法实践和工程案例