#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int main(){
char str[100] = "hello\0world";
printf("str= %s",str);
scanf("%s",str);//人工输入
cout<<"str two:"<<str<<endl;
return 0;
}
结果:str= hello
hello\0world(人工输入内容)
str two:hello\0world
结果分析:因为在输入的时候“\0"占用的是两个字符,str[5] = ‘’,str[6]=‘0’;所以第二次输出的结果是”hello\0world“
#include <iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int main(){
char * str = "hello world!";//新一代的编译不能通过,因为“hello world”在常量区,他属于不可以改变的区域
char st[6] = "hello";//而数组是将"hello world" 拷贝一份到栈区,而st的就是这个字符串的首地址。
*(st+1) = 'i';//正确,是因为str在栈区分配的空间,可以修改的。
*(str+1) = 'i';//错误,因为str指向的是一个常量区,他的内容是不可以改变的。 数组名是一个常量指针,是不可以被"++"或“--”(这里没有出现)
str = st;//这是可以的,因为指针之间是可以相互的赋值。
printf("str:%s,st:%s",str,st);
return 0;
}
1.数组名代表了一个指向数组首元素的常量指针,一经定义,不可更改,数组名作为常量指针,其类型与数组元素类型相同。指针是变量指针,定义之后仍可更改,其类型在定义时确定。
2.当出现sizeof,和&操作符时,str为数组首元素的地址,&str表示数组的地址(上升到了一个数组为整体),数组名不再当成指向一个元素的常量指针来使用(而是作为一个数组来使用),而指针仍当成指向一个元素的变量指针来使用。