从反思谈论阵列和指针的几个问题,腾讯的笔名

时间:2014.04.18

位置:基地地板

----------------------------------------------------------------------------------------

一、题目

#include<iostream>
using namespace std;
int A(char a[10])
{
	return sizeof(a);
}
int main(){
	char a[10];
	int result = sizeof(a)* 10 + A(a) * 2;
	cout << result << endl;
	return EXIT_SUCCESS;
}

给出打印结果 ?

----------------------------------------------------------------------------------------

二、数组名与指针

关于数组名关于数组名要明白这么几点 :

1.数组名不是指针数组名的实质是在于它是指代的实体是一种数据结构。这样的数据结构就是数组。

所以:

int a[10];

cout<<sizeof(a);

结果将会是40。由于在这里a指代的是int型的数组。该数组大小为10

2.数组名的外延

正如上面所说,数组名本质上是指代一种数据结构,但它的外延是数组名能够转化为指向其指代实体的指针,并且是一个指针常量,既然这个指针是一个常量的话就不能够对它进行改动和更新操作,比方:

int a[10];

a++;

这样子编译是通只是的。

3.指向数组的指针是第二种变量类型。大小为4byte,只意味着数组的存放地址。由于在函数中,我们经常使用到指向数组的指针。

4.数组名在非常多用途下行为类似指针

比方strcpy函数原型是接受两个參数均为char型指针,但在调用时我们能够传给它两个数组名,所以在这里数组名行为类似指针。

5.数组名的去数据结构内涵

数组名去内涵表现为两点:一是数组名作为函数形參时,在函数体内,会失去它本身的数组数据结构这样的内涵,在函数体内它只表现为一个指针,二是并且,在失去它内涵的同一时候,也失去了常量特性,在函数体内它作为一个普通指针,可增可减可改动。

----------------------------------------------------------------------------------------

三、答案解析

有了这种背景后,我们再来看那个笔试题

#include<iostream>
using namespace std;
int A(char a[10])
{
return sizeof(a);
}
int main(){
char a[10];
int result = sizeof(a)* 10 + A(a) * 2;
cout << result << endl;
return EXIT_SUCCESS;
}

sizeof(a)  即对数组a求大小,为10

A(a)是将数组名作为函数实參,它的身份沦为普通指针,此时sizeof(a) 为 4

所以输出结果为 108

----------------------------------------------------------------------------------------

四、在来一个腾讯笔试题

#include<iostream>
using namespace std;
void f(char** p)
{
	*p += 2;
}
int main(){
	char* a[] = { "123", "abc", "456" }, **p;
	p = a;
	f(p);
	cout << (**p) << endl;
	return EXIT_SUCCESS;
}

解析:首先定义了一个数组a,该数组a里面存的是char* ,即a[0]是一个指向“123”的指针,a[1]是一个指向“abc"的指针....

然后p是一个指向 指针类型的指针。我们将数组a的首地址即数组地址赋给了p,由于p指向了该数组,当然我们知道p 是指向 指针类型的指针。*p便是指向相应数据类型的指针了,*p指向的char类型,于是*p+=2即向后滑动了2个byte。指向数组a[0][2]处了,***p即字符3,在此处将被打印出来。

----------------------------------------------------------------------------------------

五、还来一道腾讯笔试题

int main(){
	char p1[] = "Tencent";
	void* p2 = malloc(10);
	cout << sizeof(p1) << " " << sizeof(p2) << endl;
	return EXIT_SUCCESS;
}

解析:此处p1是数组名。sizeof(p1)计算的是数组大小,为8byte(加上了一个空字符表示结尾)。sizeof(p2),p2是一个指针,大小为4byte

----------------------------------------------------------------------------------------

六、还再来一个腾讯笔试题

#include<stdio.h>
char* getMem(void)
{
	char* p = "Hello World";
	p[5] = 0x0;
	return p;
}
void test(void)
{
	char* s = 0x0;
	s = getMem();
	printf("The output is: %s",s);
}
int main()
{
	test();
	return 0;
}

解析:s是个char* 型指针,初始化为0x0,即一開始是指向这片地址,后面调用了一个getMen函数,指向一片新地址,这片地址中存了“Hello World",而且在使用s打印字串之前,我们对字串进行过改动,将它中间的空格去换成了结束符’\0‘,这样在用printf按字符串打印时打印到Hello完毕碰到结束字符时它就不再打印了。

注意:上面的解析事实上是我的想当然,题目是原题,也不晓得是怎么回事。是有益的呢还是不有益的呢?但当我亲自调试时出现了断错误。究其原因,一方面是自己基础还不到位。人家略微一糊弄下就掉入陷阱了。在getMen函数中,char*p ="hello wordl"; 这一句仅仅是声明了一个指针变量p,它指向字串”hello world“。而”hello world"他是一个常量字符串。未在程序中使用new要么malloc排序的给它在堆上分配的空间,因此,编译器会为其分配恒定区,在一个字符串常量区值它不同意改变,因此,在程序执行过程中发生断裂错误。

时间: 2024-10-29 19:10:52

从反思谈论阵列和指针的几个问题,腾讯的笔名的相关文章

函数指针和回调函数的事

一. 函数指针 关于函数指针的概念,可以想到一个整型指针指向的是一个整型,它的值是所指向对象的地址:一个字符串指针指向的是一个字符串,它的值是所指向字符串的首地址:因此,一个函数指针当然是一个指针变量了,它所指向的是一个函数,它的值就是所指向函数的入口地址. 函数指针的定义如下: typedef int data_type; data_type (*pfun)(data_type, data_type); 上面的语句中定义了一个函数指针pfun,它表示指向一个返回值为data_type,参数为两

C语言与MATLAB接口 编程与实例 李传军编着

罗列一下以前自己学习C语言与MATLAB混编的笔记,顺便复习一遍. <C语言与MATLAB接口 编程与实例 李传军编着>(未看完,目前看到P106) 目录P4-8 ****************************************************** C-MEX函数:从MATLAB调用C语言或Fortran语言编写的函数. MEX文件:是一种按一定格式,使用C语言或者FORTRAN语言编写的,由MATLAB解释器自动调用并执行的动态链接函数.在Windows系统中,MEX

第16章 调色板管理器_16.4 一个DIB位图库的实现(1)

16.4.1自定义的 DIBSTRUCT结构体 字段 含义 PBYTE *ppRow ①指向位图视觉上最上面的一行像素.(不管是自下而上,还是自上而下) ②放在第一个字段,为的是后面定义宏时可方便访问到 int iSignature =“Dib ”,是这个结构体的标志 HBITMAP hBitmap 存储了由CreateDIBSection返回的位图句柄(注意,实质是DIB,但兼有DDB的特点,可直接BitBlt) BYTE *pBits 指向像素阵列的指针,其指针值在CreateDIBSect

C++最大的敌人是它的过去

在过去的几年里,我们谈到了关于“C++的复兴”.我们不得不承认微软是这项运动中主要参与者,我记得在Craig Symonds和Mohsen Agsen在视频中提到了这件事. 在2011年,微软写了许多文章来宣布C++的回归,并且众多微软专家如Herb Sutter在很多会议上解释了为什么C++会重新崛起,主要原因是现代C++的推广使用.而同一时间.C++11标准的认可使我们重新把C++作为一门新的语言来讨论. 然而,截至到2011年,C++已经有超过30年的历史了.因此,让开发人员相信关于新的C

全球移动互联网大会北京站第二日感受分享

由于工作原因,只参加GMIC第二天(5.6)的大会,虽然第一天噱头十足的美女机器人无法目睹,但门口的特斯拉.加长悍马和羊驼,还是让吾辈开了眼~全天在主会场听了几个感兴趣的讲座,分成以下几个方面整理分享. 场外话:神马搜索 一到会场就会发现一个美女和神兽的故事,神马搜索无意中已经将羊驼作为自己的形象代言人了,UC通过绑定神马对百度开炮,也有借此抢夺移动搜索市场新用户的意图,不过对神马并不了解的用户或者开发者来说,显然通过和"百度打架"已经成为重要营销手段的一种,和我一道参观GMIC的同事

互联网之腾讯的移动时代是一个怎么样的时代?

应该说这儿需求纠正徽剑多年前的一个判别,即当时自己认为移动互联网许多改动不是很大.现在看来发现,移动互联网应该是一次彻底改动我国互联网现状的机遇,特别是新的局势下,会倒下多个巨子,或许会造就多个新的巨子. 回到正题,说说腾讯.? 了解腾讯的前史就知道,腾讯今日的成功,很大程度上得益于当年的我国移动和我国联通,假定当年不是运营商的SP政策出台,作为烧完了投资人资金而一起又没有适宜营收的腾讯公司,早就关门了.开端因为网络付出的不广泛,腾讯QQ的相关产品怎样收费一向是个难题,SP政策的短信扣费一出台,

数组指针的反思

每次想用指针来代替数组,有一种强迫症就是,假如元素个数变化,用数组就不方便,但是每次用指针代替数组都会犯各种各样的错误: 首先,指针肯定要初始化一个地址的,初始化一个地址有两种方法,第一种就是用new或者malloc分配一个内存,自然就会产生一个地址,第二个就是创建一个数组,用数组第一个指针赋值,这样貌似就没什么意义了.所以常用new或malloc分配. 其次,不要用int* i=&x:这种形式,这种想法是错误的,因为这样不是赋值,这样就改变了指针的地址,从而使i++变成了野指针.只能用*i=x

实战c++中的智能指针unique_ptr系列-- unique_ptr的operator=、operator bool、reset、swap、get等介绍

既然打算把unique_ptr写一个系列,就要详尽一点,有些内容也许在vector的时候有个涉及,但是现在还是再谈论一番. 我们要把unique_ptr看做一个类,废话了,它当然是一个类.所以这个类肯定也重载了赋值运算符,即operator=.现在就开始看看operator=在unique_ptr中的使用: 官方描述如下: move assignment (1) unique_ptr& operator= (unique_ptr&& x) noexcept; assign null

小言C指针

        指针c语言,占据着重要的地位.终场前int.char.double其他类别似.它是一种数据类型,其特殊的原因int等基本类型的变量存储内容,针变量存放的是地址. 内存被划分成很多但愿区域,这些单元所在的"单元号"即为地址,指针的定义方式为: 数据类型  *变量名. Eg:int  *pNum; 当中.*表示pNum是一个指针型变量.int是指针变量的类型,代表它仅仅能指向int型变量. 指针还有个运算符是"&",名为:取地址符.故名思义.取地