17.c/c++程序员面试宝典-指针概述

来源:互联网 发布:淘宝详情页是怎么做的 编辑:程序博客网 时间:2024/06/05 18:35

17.c/c++程序员面试宝典-指针概述

在c++中,很多程序员都痴迷于指针的运用,很多公司在招聘较高级职位的时候,也会考察到指针的相关知识,对指针的运用能看出程序员编写程序的严谨性。指针是用来控制对象的内存地址,它功能非常强大,可以直接访问和操作系统内存,合理地运用指针也会让程序的性能得到很好的优化。


在c++中,语言可以在运行时获得变量的地址,并且具有操作地址的能力。这种功能在其他的语言中可能都不如c++中如此重要,被用来操作变量地址的特殊类型的变量就是指针变量。指针可以用于数组,或者作为函数的参数,用来访问内存和对内存的操作。由于指针的作用,使得c++的功能非常强大,它可以使程序变得非常高效,但是指针使用起来又比较危险,使用不当会导致程序出现比较严重的问题。



面试题83  什么是指针***


分析:程序中的所有变量和常量都存在一个内存地址中。这个内存地址表示变量或者常量在内存中存储的位置,同样,函数也有对应的内存地址。内存地址的不同会导致程序执行时有所不同,指针就是用来存储内存地址的变量。


编程者所知道的所有基本数据类型,例如,int,float,double等,每一种基本数据类型都有相应的指针类型,编程者可以建立对应类型的指针来处理基本数据类型。


“*”在运算符中是表示乘法,它也被用来定义指针。指针变量的定义语句,由数据类型后跟星号,再跟指针变量名组成。定义指针的示例代码如下:

int *ip;

const int *ip2;


上面所示ip和ip2都是指针变量名,int表示该指针变量的类型是整型,*表示是指针变量。指向整型数的指针是包含该整型数地址的变量或常量。另外c++还提供了一种特殊的指针类型void*,它可以保存任何类型对象的地址。示例代码如下:

double obj=3.14;

double *pd=&obj;   //double类型指针

void *pv=&obj;   //void类型指针,在这里保存了double类型指针地址

pv=pd;


【答案】指针是用来存储内存地址的变量,它指向单个对象的地址,除了void指针类型以外,指针的数据类型与所指向地址的变量数据类型须保持一致。



面试题84  如何初始化指针并对其赋值****


分析:建立指针包括定义指针变量和给指针变量赋初值,第一次给指针变量赋值就是指针的初始化。用&符号可以获取变量的地址,指针变量用来存储变量的地址,基本的指针变量初始化示例代码如下:

int *ipstr;

int counta=20;

ipstr=&counta;

int *p=0;  //初始化指针为0


以上代码完成了提取一个变量的地址,并把它存储在一个指针变量中。如果counta的地址是0000:f233,这个时候指针变量ipstr就赋值了counta的地址0000:f233,一般来说,编程者需要尽量避免使用没有初始化的指针,因为这样很容易导致不可预料的运行错误。如果可能,除非所指向的对象已经存在,否则不要先定义指针,这样可以避免定义一个未初始化的指针。


如果编程者没有可以给指针初始化的地址值,编程者可以把指针初始化为0(在c语言中为NULL),这样指针不会指向任何实体,可以避免指针为初始化的问题。没有初始化的指针指向是随机的,它有可能导致随机修改了程序的值。


指针的赋值和初始化一样,可以通过赋值运算符“=”来完成,同样是通过&符号来获取变量的地址,并且把它赋值给指针变量,变量的数据类型需要和指针的数据类型兼容,示例代码如下:

long test=123;

long *testip;

testip=&test;  //获取变量的地址


这样的赋值语句不是正确的,虽然它也给指针变量进行了赋值,但并不是编程者需要达到的目的,代码如下:

long test=123;

long *testip;

testip=123;  //赋值为123


这样给testip指向的内存为123,而不是变量test的内存地址。这样程序在编译的时候不会发生错误,但是很可能导致程序会修改未知区域的内存。


【答案】指针的初始化就是给指针赋初值,&符号可以用来获取对象的内存地址,并且赋值给指针变量。指针变量的初始化和赋值都可以通过运算符“=”来实现。



面试题85  是否可以确定指针指向一个对象***


分析:指针用于指向对象。也迭代器一样,指针提供对其所指对象的间接访问,只是指针结构更通用一些。与迭代器不同的是,指针用于指向单个对象,而迭代器只能用于访问容器内的元素。具体来说,指针保存的是另一个对象的地址。示例代码如下:

string s("hello world");

string *sp=&s;   //sp保存了s的地址


【答案】指针用于指向对象,一个指针只指向一个对象的内存地址。



面试题86 如何使用指针操作数组****


分析:在c++语言中,指针和数组的关系很密切。特别是如果在表达式中使用数组名时,该数组名会自动转换为指向数组第一个元素的指针。示例代码如下:

int ia[]={0,2,4,6,8};  //

int *p=ia;  //指针ip指向数组第一个元素ia[0]的地址


如果希望让指针指向数组中的另一个元素,则可以先使用下标操作符给某个元素定位,然后使用地址操作符&获取该元素的存储地址。示例代码如下:

int ia[]={0,2,4,6,8};

int *ip=&ia[4];  //指针ip指向数组第5个元素ia[4]的地址

int *ip1=&ia[3];

int *ip2=&ia[1];

int diff=ip1-ip2;


上面代码中对指针进行了一个相减的计算,diff的值为2,因为地址之间的差是由元素而不是字节来决定的。


编程者还可以对多维数组使用指针,使用指针存储一维数组相对来说是比较简单的,但是用来存储多维数组就有些复杂了,声明的示例代码如下:

double beans[5][5];

double *pheans=beans[0][0];


这样把指针设置为double类型的第一个元素的地址,还可以把指针设置为数组第一行的地址:

double *pbeans=beans[0];


注意:在c++中,建议尽量避免使用指针和数组,指针和数组容易产生不可预料的错误。其中一部分时概念上的问题,因为指针用于低级操作,容易产生与繁琐细节相关的错误,而其他错误则源于使用指针的语法规则,特别是声明指针的语法。许多有用的程序都可以不使用数组或指针实现,现代c++程序采用vector类型和迭代器取代一般的数组,采用string类型取代c风格字符串。


【答案】在c、c++中,指针对于数组的操作是通过将数组的地址,通常是第一个数的地址赋值给指针来进行操作的。指针可以操作一维和多维数组。



面试题87  const对象的指针和const指针的区别**


分析:指针和const限定符之间的两种交互类型:指向const对象的指针和const指针。指向const对象的指针是指指针指向const对象的地址,编程者使用指针来修改其所指对象的值。但是如果指针指向const对象,则不允许用指针来改变其所指的const值,因为const值是不可以进行修改的。为了保证这个特性,c++语言强制要求指向const对象的指针也必须具有const特性,指向const对象的指针示例代码如下:

const double *cptr;  //cptr指针可能指向一个类型为double的常量值


在这里的cptr是一个指向double类型的const对象的指针,const限定了cptr指针所指向的对象类型,而并非cptr本身。cptr本身并不是const,在定义时不需要对它进行初始化。也可以给cptr重新赋值,使其指向另一个const对象。但不能通过cptr修改它所指的const对象的值。


另外,不可以使用void*指针保存const对象的地址,而必须使用const void*类型的指针来保存const对象的地址。示例代码如下:

const int universe=42;

const void *cpv=&universe;  //正确,cpv是一个常量

void *pv=&universe;   //错误,universe是一个常量


除指向const对象的指针外,c++语言还提供了const指针,const指针自身的值不能被修改。示例代码如下:

int a=0;

int *const curs=&a;   //cura是一个const指针


上面所示cura是指向int型对象的const指针。与其他const变量一样,const指针的值不能修改,这就意味着不能使cura指向其他对象。任何企图给const指针赋值的行为(即使给cura赋回同样的值)都是不合法的。const指针和其他const变量一样,必须在定义的时候进行初始化。


【答案】const指针的值不可以被修改,但是可能可以使用该指针修改它所指向对象的值。指针所指对象的值能否修改完全取决于该对象的类型,而指向const变量的指针不可以修改所指向的const变量的值,但是自身可以被重新赋值。



面试题88  数组指针与指针数组的区别****


分析:指向一个数组的指针就是数组指针。定义数组指针的示例代码如下:

int (*ap)[2];


以上代码定义了一个指向包含两个整型元素的数组指针。


而如果一个数组的每一个元素都是指针,则这个数组是一个指针数组。定义指针数组的示例代码如下:

char *characrr[]={"fortan","c","c++","basic"};


以上代码定义了一个指针数组并且对其进行了初始化,chararr数组的每个元素都存放着一个字符指针,初始化时每个值都是一个字符串常量,而对应的字符指针存储了3个字符第一个字母在内存中的位置。


很多时候,使用指针数组来控制程序可以节约内存空间,也可以节约时间。一个使用指针数组的示例代码如下:

#include<stdlib.h>

#include<stdio.h>

main()

{

char *pchar1[4]={"china","chengdu","sichuang","chongqin"};

//指针数组pchar1的4个指针分别依次指向4个字符串

int i,*pchar2[3],a[3]={1,2,3},b[3][2]={1,2,3,4,5,6};

for(i=0;i<4;i++)

{

printf("\n%s",pchar1[i]);

//输出pchar1数组4个指针指向的4个字符串

printf("\n");

}

for(i=0;i<3;i++)

{

pchar2[i]=&a[i];  //将整型一维数组a的3个元素的地址传递给指针数组pchar2

for(i=0;i<3;i++)

{

pirntf("%4d",*pchar2[i]);

printf("\n");

}

}

for(i=0;i<3;i++)

{

pchar2[i]=b[i];  //传递二维数组b的每行首地址给指针数组的4个指针

for(i=0;i<3;i++)//按行输出

printf("%4d%4d\n",*pchar2[i],*pchar2[i]+1);

}

}


数组指针和指针数组是比较难的问题,很多考官借此类问题来考察程序员的编程思维和严谨度。


【答案】数组指针是一个指针变量,它指向一个数组。而指针数组是一个只包含指针元素的数组,它的元素可以指向相同类型的不同对象。






0 0
原创粉丝点击