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

问题是:为什么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:面试时要时刻保持头脑的清醒,淡定,千万不要被面试官给引到沟里去了!

为什么C/C++语言使用指针的更多相关文章

  1. 浅谈c语言的指针

    对于非计算机专业的同学,c语言的指针往往就是老师的一句“指针不考“就带过了.c语言的指针号称是c语言的灵魂,是c语言中最精妙的部分. 指针本质上也是变量,也就是一段内存,只是他的特殊之处是他存储的数据 ...

  2. C#委托与C语言函数指针及函数指针数组

    C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...

  3. C语言二重指针与malloc

    (内容主要源于网上,只是加入了些自己的剖析) 假设有一个二重指针: char **p; 同时有一个指针数组 char *name[4]; 如何引用p呢? 首先我们有程序代码如下 #include &l ...

  4. C语言函数指针基础

    本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...

  5. C语言的指针变量

    C语言的指针变量 在C语言中,变量是固定范围的存储空间,它存储的是赋给他的值, 比如: ; /* 这里是定义一个整型变量a,并把12这个值存储在a的地址空间上 这个地址空间是系统随机分配的,对用户是透 ...

  6. Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

    Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...

  7. “对外部(局部)变量的访问”是C语言函数指针的最大弱点

    1.“对外部(局部)变量的访问”是C语言函数指针的最大弱点 . #include <stdio.h> #include <stdlib.h> /* 结构体定义 */ struc ...

  8. go语言学习--指针的理解

    Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,array/slice,map,chan, fu ...

  9. C语言中指针占据内存空间问题

    以前一直有个疑问,指向不同类型的指针到底占用的内存空间是多大呢? 这个问题我多次问过老师,老师的答案是"指向不同类型的指针占据的内存空间大小不同",我一直很之一这个答案,今天我就做 ...

随机推荐

  1. Float精度 在JS的解决方法

    最近在做一个工资核算的系统,所有的运算全部在前台进行,因此用了的是JS来做. 做完以后,经手工核算,发现一个奇怪的问题.就是JS算出来的结果跟用计算器算出来的结果有差距. 想了很久,也没有想出问题出在 ...

  2. Ubuntu15.10使用mysql

    安装 sudo apt-get install mysql-server sudo apt-get install mysql-client sudo apt-get install libmysql ...

  3. Linux查看和改变网卡的一些信息

    昨天遇到一个问题,就是网卡的速率问题.本身是1000Mb,可是显示为10Mb,这个问题对于我这个菜鸟来说是个难以解决的问题.当然,第一件事是查询Linux中哪个命令能 改变网卡的速率. localho ...

  4. ado.net 基础(一)

    // C#操作数据库的基础1 引用两个命名空间using data:using date.sqlclient;2 创建与数据库的连接方法一: sqlconnection a = new sqlconn ...

  5. hihocoder 1037 数字三角形

    #1037 : 数字三角形 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 问题描述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他们来到了大洋彼岸 ...

  6. FusionCharts Free 注意事项

    前段时间做的项目中用到了FusionCharts Free 这个插件,今天上班打开网站后竟然发现线形图出错了,如图: Y轴都是 NaNM ,经过在网上的一番查询后终于得知为什么了. 原来Free 版本 ...

  7. Game start

    今天开始有计划的码代码吧!!我可是以后要进微软或者google的男人.初步计划先学习编程之美吧,每天码一到题的解法,每天每天每天..然后是ACM竞赛基础,每天一节同上.最后..不对,冷静冷静,我已经没 ...

  8. ios中的事件处理、响应者链条以及第一响应者

    在ios中,事件UIEvent类来表示,当一个事件发生时,系统会搜集的相关事件信息,创建一个UIEvent对象,最后将该事件转发给应用程序对象(UIApplication).日常生活中,主要有三种类型 ...

  9. 开放-封闭原则(OCP)

    对于僵化性的臭味,应用OCP原则之后,再进行同样的改动时,只需添加新代码,而不必改动已正常运行的代码. 扩展模块行为的方式通常是修改模块的Code,不允许修改的模块常常被认为是具有固定的行为. Ope ...

  10. CSS制作彩虹效果

    今天看到一篇文章,说到margin的塌陷的问题,并提供了好几个例子. 自己之前还没怎么遇到过这个问题,正好来研究一下. <div class="box1"></d ...