一个面试题,很基础,却有很多东西可以挖掘+char*+char[]+与char*[]++char(*[])
2011-10-13 13:13
267 查看
先给出题目,问输出多少:
1、先纠正自己几个语法上的错误思想
看下面这个测试程序:
这个程序编译是通不过的,问题出在
问题出在这几行,str是char[]类型的,不是指针类型,不支持自增自减。但是str存的是字符串首地址,赋给p指针之后,可以通过p自增自减截取子串。
再看这个测试程序:
原来,str被隐式转换为char*类型,但是相反的过程不支持,这点保证了str的内容始终指向字符串在常量区中的首地址。
2、char*与char[]的区别
摘自网上一段话,自己做了修改
char *Str;Str="abcdef"; Str指向常量区,不能更改字符串的值 char Str[]="abcdef"; 在栈区,可以改变
首先第一个指针形式的str指向一个字符串,这样指向以后就不能通过str对abcdef这个字符串修改了,但是你可以给str用别的字符串再赋值,这样他就指向了别的字符串,
如: char *Str = "abc";
Str = "def";
但是一旦指向某个字符串,就不能通过这个指针对字符串修改了。
第二种数组形式的str,其实数组名就是指针常量,也就是说一旦他初始化了,它指向的地址就固定了,就不能再用别的字符串赋值了(这就不同于指针形式的str),但是 这个地址里放什么是可以改变的(指针形式的就不能改变了),比如说初始化之后在通过cin>>str改变数组的内容还是没有问题的。
3、char *str[]的类型问题
str是一个char*[]类型,与char[]一样,同样指向常量区中的首地址,该块内存中顺序存放了n的char*类型的指针,如上题就是4个地址,第一个地址指向"Welcome"字符串的首地址、依次类推。所以:
这两端是等效的。
可以这么看 char* str[] ,即str是一个数组,数组内的元素类型是char*
4、回到面试题也就不难理解了
char **p=str+1;是取到了指向str[1]的指针
str[0]=(*p++)+2;是先取p的内容,内容即是"to"字符串首字母的地址,然后+2,指向了第三个字符,即'\0',在p++,此时p为指向str[2]的指针
str[1]=*(p+1); p先加1,指向了str[3]再取内容,返回的是"Nanjing"的首字母地址
str[2]=p[1]+3; 等效于 str[2] = *(p+1) + 3; p为指向str[2]的指针 +1之后为指向str[3]的指针,取内容返回"Nanjing"首字母地址,+3之后指向"Nanjing"字符串中j的地址
str[3]=p[0]+(str[2]-str[1]); str[2]为指向"Nanjing"字符串中j的地址,str[1]为"Nanjing"首字母地址,相减返回3,p[0]指向了str[2],str[]此时为指向"Nanjing"字符串中j的
指针,+3之后指向了'g'
输出结果为:Nanjingjingg
输出str[0]为空
输出str[1]为Nanjing
输出str[2]为jing
输出str[3]为g
5、char*str[]与char(*str[])等效
#include <iostream> using namespace std; int main() { char* str[]={"Welcome","to",Fortemedia", "Nanjing"}; char **p=str+1; str[0]=(*p++)+2; str[1]=*(p+1); str[2]=p[1]+3; str[3]=p[0]+(str[2]-str[1]); cout<<str[0]<<str[1]<<str[2]<<str[3]<<endl; }
1、先纠正自己几个语法上的错误思想
看下面这个测试程序:
#include <iostream> using namespace std; int main() { char str[]="Welcome"; char* p = str; cout<<++str<<endl; cout<<++str<<endl; cout<<++str<<endl; cout<<++p<<endl; cout<<++p<<endl; cout<<++p<<endl; }
这个程序编译是通不过的,问题出在
cout<<++str<<endl; cout<<++str<<endl; cout<<++str<<endl;
问题出在这几行,str是char[]类型的,不是指针类型,不支持自增自减。但是str存的是字符串首地址,赋给p指针之后,可以通过p自增自减截取子串。
再看这个测试程序:
int main() { char str[]="Welcome"; char* p = str + 1; str = str + 1; //出错提示为:“=”: 无法从“char *”转换为“char [8]” cout<<++p<<endl; cout<<++p<<endl; cout<<++p<<endl; }
原来,str被隐式转换为char*类型,但是相反的过程不支持,这点保证了str的内容始终指向字符串在常量区中的首地址。
2、char*与char[]的区别
摘自网上一段话,自己做了修改
char *Str;Str="abcdef"; Str指向常量区,不能更改字符串的值 char Str[]="abcdef"; 在栈区,可以改变
首先第一个指针形式的str指向一个字符串,这样指向以后就不能通过str对abcdef这个字符串修改了,但是你可以给str用别的字符串再赋值,这样他就指向了别的字符串,
如: char *Str = "abc";
Str = "def";
但是一旦指向某个字符串,就不能通过这个指针对字符串修改了。
第二种数组形式的str,其实数组名就是指针常量,也就是说一旦他初始化了,它指向的地址就固定了,就不能再用别的字符串赋值了(这就不同于指针形式的str),但是 这个地址里放什么是可以改变的(指针形式的就不能改变了),比如说初始化之后在通过cin>>str改变数组的内容还是没有问题的。
3、char *str[]的类型问题
str是一个char*[]类型,与char[]一样,同样指向常量区中的首地址,该块内存中顺序存放了n的char*类型的指针,如上题就是4个地址,第一个地址指向"Welcome"字符串的首地址、依次类推。所以:
char* str[]={"Welcome","to","Fortemedia", "Nanjing"};
char *a="Welcome"; char *b="to"; char *c="Fortemedia"; char *d="Nanjing"; char* str[]={a,b,c,d};
这两端是等效的。
可以这么看 char* str[] ,即str是一个数组,数组内的元素类型是char*
4、回到面试题也就不难理解了
char **p=str+1;是取到了指向str[1]的指针
str[0]=(*p++)+2;是先取p的内容,内容即是"to"字符串首字母的地址,然后+2,指向了第三个字符,即'\0',在p++,此时p为指向str[2]的指针
str[1]=*(p+1); p先加1,指向了str[3]再取内容,返回的是"Nanjing"的首字母地址
str[2]=p[1]+3; 等效于 str[2] = *(p+1) + 3; p为指向str[2]的指针 +1之后为指向str[3]的指针,取内容返回"Nanjing"首字母地址,+3之后指向"Nanjing"字符串中j的地址
str[3]=p[0]+(str[2]-str[1]); str[2]为指向"Nanjing"字符串中j的地址,str[1]为"Nanjing"首字母地址,相减返回3,p[0]指向了str[2],str[]此时为指向"Nanjing"字符串中j的
指针,+3之后指向了'g'
输出结果为:Nanjingjingg
输出str[0]为空
输出str[1]为Nanjing
输出str[2]为jing
输出str[3]为g
5、char*str[]与char(*str[])等效
相关文章推荐
- 【Java基础】Java中的char是否可以存储一个中文字符之理解字符字节以及编码集
- 网易面试题之给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢, * 和一般的游戏所不同的是,他每一步
- 过年啦!小B高兴的不行了,她收到了很多红包,可以实现好多的愿望呢。小B可是对商店货架上心仪的货物红眼好久了,只因囊中羞涩作罢,这次她可是要大大的shopping一番。小B想去购物时,总是习惯性的把要买的东西列在一个购买清单上,每个物品单独列一行(即便要买多个某种物品),这次也不例外。
- 谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?
- 定义一个定义完整的类(是可以当作独立的产品发布,成为众多项目中的“基础工程”)。扩展+、-、*、/运算符的功能,使之能与double型数据进行运算。设Complex c; double d; c+d和
- 《c primer pius》第六章第14题,发现网上好多都有问题,编写一个程序读入一行输入,然后反向打印该行,您可以把输入存储在一个char数组中
- 33. 百度面试题:有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从这个输入 流中随机取得m个记录
- 在Sprite 基础之上创建一个既可以控制移动,也可以动画的对象定义。
- 新浪微博 陈利人 面试题 给定k个数组,每个数组有k个整数。每个数组中选取一个整数,一共k个整数,取其和,一共可以得到k^k个和。给出方法,求得这k^k个和中,最小的k个。
- 一个真实的项目经历,很多东西大家可以借鉴下
- 【C语言】【面试题】使用main函数的参数,实现一个整数计算机,程序可以接受三个参数
- 一个真实的项目经历,很多东西大家可以借鉴下
- java基础中一些值得聊的话题(可以当做面试题)
- 一个java3d程序,作为熟悉3d技术的基础(可以使用鼠标对场景内的3d对象进行操作)
- 分享一个PopFile的库,原来windows程序设计里边有很多很好的东西,一直都在错过!
- Java基础查漏补缺:(String篇)一个面试题问倒了我,原来String并不简单
- 网易面试题之给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢, * 和一般的游戏所不同的是,他每一步
- 介绍一个可以把东西传到LINUX下的FTP客户端
- 一个真实的项目经历,很多东西大家可以借鉴下
- 继承与合成基本概念 继承:可以基于已经存在的类构造一个新类。继承已经存在的类就可以复用这些类的方法和域。在此基础上,可以添加新的方法和域,从而扩充了类的功能。 合成:在新类里创建原有的对象称为合成。