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[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!

 

转载于:https://www.cnblogs.com/seven7seven/p/3664157.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值