C++中的字符数组、字符指、字符串针(腾讯)
2014-04-14 16:49
483 查看
一、字符数组
1、定义时进行初始化的方式
(1)char c[12]={'I',' ','a','m',' ','h','a','p','p','y'};//最后两个元素自动补‘\0’(不是空格),其ASCII码为0
(2)char c[]={'I',' ','a','m',' ','h','a','p','p','y'};//数组c长度自动定为10
(3)char c[12]="I am happy";////最后自动补‘\0’
(4)char c[]="I am happy";//数组长度为11,以为对于字符串常量,系统自动在最后加‘\0’
与char c[]={'I',' ','a','m',' ','h','a','p','p','y','\0'}等价,与(2)中的不等价。
注意:前面所提到的都是sizeof(),它计算数组的实际大小;但strlen()计算的是实际有效的长度(‘\0’不计算在内)。
2、定义之后再赋值
不能用上面的两种方式。应该:
char c[10];
c[0]='I';c[1]=' ';……
二、字符串处理函数
用字符数组存放字符串时用字符串函数;用string变量存放字符字符串时可以用简单的运算符。
1、字符串连接函数strcat(char[],const char[]);(+)
2、字符串复制函数strcpy(char[],const char[]);(=)
3、字符串比较函数strcmp(const char[],const char[]);(>,<)
4、字符串长度函数strlen(const char[]);
三、对比
1、字符数组(腾讯笔试)
2、指向字符串的字符指针
3、字符串变量
四、双重指针指向字符串数组(腾讯笔试)
解析:s表示的是整个指针数组(一维)(加1的话表示移到下一行),*s表示的是指向行(加1的话只移动一个元素的位置),**s表示的是单个字符(加1就是修改元素值了)。
p=s;所以p是指向指针数组首地址(也就是首元素地址)的指针(指向指针的指针)。
调用fun()时,*p是指向行的(加1的话只移动一个元素的位置),*p+=2;使得地址值加2,(因为指向char型元素,所以实际地址加2*1),原来指向“hello”的首地址,加2后,指向"llo"的首地址。下图(图有错:s[0]指向不是“C”,而是“hello”)
五、虚函数、形参传数组时(细心啊!)
解析:foo(100)因为Base中foo()是虚函数,所以调用子类中的foo():foo(100)返回100*20;
foo1(c)因为Base中的foo1()不是虚函数,所以调用父类中foo1():foo(c)返回sizeof(c)+10=4+10。注意c经过传递变为了指针,大小为4!
1、定义时进行初始化的方式
(1)char c[12]={'I',' ','a','m',' ','h','a','p','p','y'};//最后两个元素自动补‘\0’(不是空格),其ASCII码为0
(2)char c[]={'I',' ','a','m',' ','h','a','p','p','y'};//数组c长度自动定为10
(3)char c[12]="I am happy";////最后自动补‘\0’
(4)char c[]="I am happy";//数组长度为11,以为对于字符串常量,系统自动在最后加‘\0’
与char c[]={'I',' ','a','m',' ','h','a','p','p','y','\0'}等价,与(2)中的不等价。
注意:前面所提到的都是sizeof(),它计算数组的实际大小;但strlen()计算的是实际有效的长度(‘\0’不计算在内)。
2、定义之后再赋值
不能用上面的两种方式。应该:
char c[10];
c[0]='I';c[1]=' ';……
二、字符串处理函数
用字符数组存放字符串时用字符串函数;用string变量存放字符字符串时可以用简单的运算符。
1、字符串连接函数strcat(char[],const char[]);(+)
2、字符串复制函数strcpy(char[],const char[]);(=)
3、字符串比较函数strcmp(const char[],const char[]);(>,<)
4、字符串长度函数strlen(const char[]);
三、对比
1、字符数组(腾讯笔试)
#include <iostream> #include <stdio.h> using namespace std; int main(){ char r[20]="hello world";//是数组,而不是字符串常量,可以改变内容,如下面单独修改r[5] cout<<r<<endl;//输出hello world,直到遇到'\0'为止 r[5]=0x0;//相当于'\0' cout<<r<<endl;//输出hello cout<<*r<<endl;//输出h }
2、指向字符串的字符指针
#include <iostream> #include <stdio.h> using namespace std; int main(){ char *pstr="hello world";//pstr是指向字符串常量的指针 cout<<pstr<<endl;//输出hello world pstr[5]=0x0;//不可以改变字符串常量的值!!编译虽然通过,但是无法运行 cout<<pstr<<endl;//无法运行 cout<<*pstr<<endl;//无法运行 }
3、字符串变量
#include <iostream> #include <stdio.h> #include <string>//注意增加这条文件包含命令 using namespace std; int main(){ string str="hello world";//定义一个字符串变量str,并初始化 cout<<str<<endl;//输出hello world str[5]=0x0;//不可以!! cout<<str<<endl;//输出hello world //cout<<*str<<endl;//无法通过编译 }
四、双重指针指向字符串数组(腾讯笔试)
#include <iostream> #include <stdio.h> void fun(char** p){ *p+=2; } int main(){ char *s[] = {"hello","Basic","Foxpro","Visual Studio"};// 定义了一个指针数组。该数组中的每个元素都是指针,一共4个元素sizeof(s)=4*4=16 char **p=s;//定义了一个指向指针的指针。 printf("%d\n",sizeof(s));//16 printf("%d\n",sizeof(*s));//4 printf("%s\n",*s);//输出hello printf("%s\n",*s+2);//输出llo fun(p);//与fun(s);等价 printf("%s\n",*s);//输出llo,与printf("%s\n",*p)相同 printf("%c\n",**s);//输出l,与printf("%c\n",**p)相同 printf("%s\n",*(s+2));//输出Foxpro,与printf("%s\n",*(p+2))相同 printf("%c\n",**(s+2));//输出F }
解析:s表示的是整个指针数组(一维)(加1的话表示移到下一行),*s表示的是指向行(加1的话只移动一个元素的位置),**s表示的是单个字符(加1就是修改元素值了)。
p=s;所以p是指向指针数组首地址(也就是首元素地址)的指针(指向指针的指针)。
调用fun()时,*p是指向行的(加1的话只移动一个元素的位置),*p+=2;使得地址值加2,(因为指向char型元素,所以实际地址加2*1),原来指向“hello”的首地址,加2后,指向"llo"的首地址。下图(图有错:s[0]指向不是“C”,而是“hello”)
五、虚函数、形参传数组时(细心啊!)
#include <iostream> #include <stdio.h> using namespace std; class BASE{ public: virtual int foo(int a){ return a*10; } int foo1(char a[10]){ return sizeof(a)+10; } }; class Derived :public BASE{ public: int foo(int a){ return a*20; } virtual int foo1(char a[20]){ return sizeof(a)+10; } }; int main() { Derived a; BASE* b = &a; char c[10]; cout<<b->foo(100)+b->foo1(c)<<endl;//输出2014 }
解析:foo(100)因为Base中foo()是虚函数,所以调用子类中的foo():foo(100)返回100*20;
foo1(c)因为Base中的foo1()不是虚函数,所以调用父类中foo1():foo(c)返回sizeof(c)+10=4+10。注意c经过传递变为了指针,大小为4!
相关文章推荐
- c++中字符数组与字符串的转换
- C++字符数组的输入输出和字符串结束标志使用讲解
- 一道二级C题引发的思考-- c++函数传递指针的本质 与 字符串指针与字符数组的区别
- c++中怎样将字符数组转化成字符串变量...?
- C++ 文件流、字符串流、字符数组、字符串
- 浅谈C++字符数组与字符串指针
- C++ 中使用字符数组来存放未知长度的字符串
- C++ 字符串,字符数组,数字之间转换
- C++字符数组表示字符串--易错标识
- (31)'c++:COMPLETE REFERENCE' 第一部分 第四章(数组和以空字符结束的字符串) 第六节
- C++基础之字符数组和字符串
- C++字符串数组赋值与单个字符赋值区别
- 学习C/C++语言:字符数组的使用,统计字符串中单词个数
- C++ 字符串string与字符数组char[ ]的异同
- C++中字符数组和字符串string
- C++指针和数组:字符和字符串、字符数组
- 程序目的:实现c++整型和字符数组,字符串的相互转化
- c/c++ 字符数组、字符指针和字符串类型
- C++基础之字符数组和字符串
- C/C++(字符串处理)字符指针、字符数组用法大总结