字符指针、字符数组

1.字符指针

https://blog.csdn.net/qq_43668570/article/details/98980446

指向字符型数据的指针变量。每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。

即将字符串的首地址赋值给字符指针可让字符指针指向一个字符串

如下:

    char* p1="abc";
    char* p2="abc";
    cout<<(p1==p2)<<endl;//1
    cout<<p1<<" "<<p2<<" "<<endl;//abc abc
    cout<<*p1<<" "<<*p2<<" "<<endl;//a a 
   cout<<&p1<<" "<<&p2<<endl;//0x62fe18 0x62fe10

对指针取内容,是首个字符;对指针取地址,获取到了指针的地址。

一般来说,不是要取内容*才能获取到内容吗?这里直接输出p1和p2就可以获取到内容了?

对int型数字来说:

    int* p1=new int(5);
    int* p2=new int(5);
    cout<<(p1==p2)<<endl;//0
    cout<<p1<<" "<<p2;//0x2522560 0x2522580
cout<<&p1<<" "<<&p2<<endl;//0x62fe18 0x62fe10
cout<<*p1<<" "<<*p2<<endl;//5 5

直接输出p1和p2是输出的地址,它们所指向的堆内存的地址,只有用了取内容符号之后才会输出所指内存的内容。

char str[10] = "Hello";
char *ptr = str;//数组名代表数组的首地址
//等价于
 char *ptr;
 ptr = str;//等价于ptr = &str[0];将数组的首地址赋给字符指针ptr

2.是否添加\0?

https://blog.csdn.net/wuwuku123/article/details/103608918

这种方法定义时,系统会自动在字符串的末尾加上字符串结束符,即 ‘\0’,:

char str[]="12345";//sizeof(str)为
char str[]={"12345"};//6
char str[6]="12345";//6

这种方法定义时,系统会自动从未初始化的元素开始,将之后的元素赋为\0,如上面的数组str中的元素实际上是:'1','2','3','4','5','\0','\0','\0','\0','\0'

char str[10]={'1','2','3','4','5'};

系统不会自动在字符串的末尾加上字符串结束符;

此时用sizeof()函数可以正确求出其所占的内存大小;但用strlen()函数不能正确求出其长度,因为strlen是通过\0判断字符串结束的。

char str[]={'1','2','3','4','5'};

所以,采用该方法定义时,一般人为地加上\0,即char str[]={'1','2','3','4','5', '\0'};

char str[]={'1','2','3','4','5', '\0'};

char str[6]={'1','2','3','4','5'}; //故意给数组预留一个空位

char str[]={“12345”};//第一行手动添加\0后和当前效果相同

 

posted @ 2021-09-14 14:32  lypbendlf  阅读(112)  评论(0编辑  收藏  举报