C++中的字符数组、字符指、字符串针(腾讯)
一、字符数组
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[]="hello world";//是数组,而不是字符串常量,可以改变内容,如下面单独修改r[5]
cout<<r<<endl;//输出hello world,直到遇到'\0'为止
r[]=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[]=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[]=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));//
printf("%d\n",sizeof(*s));//
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+));//输出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*;
}
int foo1(char a[]){
return sizeof(a)+;
}
};
class Derived :public BASE{
public:
int foo(int a){
return a*;
}
virtual int foo1(char a[]){
return sizeof(a)+;
}
}; int main()
{
Derived a;
BASE* b = &a;
char c[];
cout<<b->foo()+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++中的字符数组、字符指、字符串针(腾讯)的更多相关文章
- java字符数组char[]和字符串String之间的转换
java字符数组char[]和字符串String之间的转换 觉得有用的话,欢迎一起讨论相互学习~Follow Me 使用String.valueOf()将字符数组转换成字符串 void (){ cha ...
- JPasswordField 中得到的字符数组转化为字符串(密码乱码问题)
转载自:http://blog.csdn.net/skl_tz/article/details/9009805 JPasswordField 用作密码的输入框,似乎很方便,但是,为了得到输入的内容,一 ...
- qt 字符数组如何转换字符串?
char 字符数组如何转换成 QString? char source{1024} = {0}; QString des = QString::fromLocal8Bit(source);
- c语言中的字符数组与字符串
1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y ...
- C语言中的字符数组和字符串
在C语言中,没有字符串类型,但是可以通过字符数组来模拟字符串. 字符串可以在栈上,堆上,静态区和常量区进行分配. char buf[50] = "abc"; char buf[] ...
- C语言中整形数组、字符数组、字符串的区别
一. 第一 整型数组的存放,数组最后是不加'\0'的,字符串会自动加上,因此存放字符的时候数组的大小要比实际字符的多一个 第二 整型数组 每一个单元是4个字节的,字符串是一个一个字符存放的,每个字符占 ...
- java中字符数组与字符串之间互相转换的方法
public static void main(String[] args) { //1.字符数组 转换成 字符串 //(1)直接在构造String时转换 char[] array = new cha ...
- C语言字符串与字符数组
字符串儿与字符数组 字符数组的定义: Char buffer[]; 字符数组初始化: Char buffer1[]="hello world"; 利用scanf输入一个字符串儿 代 ...
- [c语言]字符数组、字符串定义
C语言中字符串通常用字符指针和字符数组来定义: char* pS="abcdef"; char s[]="abcdef"; 这两种方式都会在结尾为字符串隐式补结 ...
- c语言指针字符串与字符数组字符串的区别
#include <stdio.h> int main() { //字符串常量,存放于内存常量区. //常量区区的内存具有缓存机制, //当不同指针指向的常量值相同时, //其实这些指针指 ...
随机推荐
- 一文搞懂HTTP和HTTPS协议
1.什么是协议? 网络协议是计算机之间为了实现网络通信而达成的一种"约定"或者"规则",有了这种"约定",不同厂商的生产设备,以及不同操作系 ...
- 使用 Unity* 进行并行处理的一种方法
本文展示如何使用 Unity* 对游戏进行并行处理,以及如何使用游戏引擎执行与游戏相关的物理.在这个领域内,现实感是成功的一个重要标志.为了模拟真实世界,许多动作需要同时发生,这需要并行处理.创建两个 ...
- mariadb数据库基础
1.数据库介绍 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据 ...
- cf1151e number of components
很常见的思想:将整体求改为统计每个部分的贡献 本题中统计[l, r]时, 每个连通块有一个重要特征, 最右端的数在[l,r]中而下一个数不在(好像是句废话 那么我们分别考虑每个点对连通块的贡献, 即它 ...
- 原生js实现选中所有的checkbox
<div class="con"> <input name='多选项名称' type='checkbox' value='' id="all" ...
- vue--生命周期演示
vue实例的生命周期:https://cn.vuejs.org/v2/guide/instance.html#%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA-Vue-%E5% ...
- C语言博课作业11
一.本周作业头 这个作业属与那个课程 C语言程序设计I 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/10130 ...
- 思考--PostgreSQL在与mysql的比较中稍微弱势项
PostgreSQL在与mysql的比较中稍微弱势项: 1.都是堆表,没有所谓的聚集索引表,其实问题不大,聚集索引表也只是在使用聚集索引那些列有加速,而且pg也有聚集索引,只不过要定期重建. 2.mv ...
- Django查询数据库返回字典dict数据
个人观点: 个人认为,在Django项目中, 开发团队为了让使用该框架的用户都使用自带的序列化功能,从而让框架中的SQL返回值很不直观,对于直接使用SQL语句的用户很犯难. 解决: from djan ...
- 多线程之小米商店APP爬虫
#今日目标 **多线程之小米商店APP爬虫** 爬取小米商店所有社交APP ``` import requests import time from threading import Thread f ...