字符串,是数组,也是指针,指针就是地址呀!只是附加了类型信息而已!数组名是附加了长度信息的指针常量,指针是附加了类型信息的地址,所以数组名就是一个指针常量!所以可以直接赋值给指针!字符串常量,是一个常量数组,值是个常量指针常量!可以赋值给指针!地址可以赋值给指针!指针是有类型的、数组也是有类型的!
数组是一批变量或常量,数组名是第一个元素的地址,即首地,数组空间长度可以用sizeof(数组名)得到,这是数组名和指针,地址的最大区别!字符串常量可以认为整个常量就是一个字符常量数组名,可以初始化字符数组和字符指针,可以给字符指针赋值!用于初始化数组的字符串常量和数组名占用同一空间!用于初始化指针的字符串常量和指针占用不同空间,所以用字符串常量初始化指针和给指针赋值差别不大!不能给整个数组直接赋值!只能初始化!
另外由于可以给结构等自定义类型整体赋值和初始化,所以结构等用户自定义类型、即使内部含有数组也可以整体赋值或初始化,不用单独处理其中的数组成员!除非只打算改变数组成员,这时要逐一处理数组的每个元素或调用函数如strcpy,memcpy处理,!
一个变量或数
组声明的同时加个=后面为常量,变量,函数调用等表达式或数组,结构等的初始化表称为变量或数组定义!
定义中的 变量名=表达式 或 数组名=初始化表称为初始化!
非初始化语句中的 变量名 =表达式;称为赋值!
非参数的局部变量声明也可看作定义,但是并未初始化,这种还是看作声明更好!
是的。
语句里 p 是 (char * ) 型 地址。 *p 是 值, char 型。
p="welcome"; 不太好理解,C/C++里有不少 不严谨的地方,没有太多 道理 好言。
这句就理解成 自动 做了强制转换了:
p= (char *) "welcome";
于是:
cout << p ; 打印出 welcome
cout << *p; 打印出 w
char *p;
p="welcome";
你定义的是一个char型的指针,p指向“welcome”的首地址,在存储空间里面逻辑地址是相连的
,此时下面语句
printf("%s",p);//会打印welcome字符串,因为p指向地址,%s打印的时候不遇到'\0'不结束
printf("%c",*p);//此时打印一个字符w,
printf("%c",*(p+1));/此时打印e
C中字符串就是用第一个元素的地址表示的……
字符串a的地址就是a中第一个元素的地址。
char*p;p="welcome"
p就指向"welcome"的地址
"welcome"是字符串常量
怎么说呢,字符串常量就是在全局区定义一个字符串,只是它没有名字,我们要取得它的地址就是用双引号加字符串常量的内容
"welcome"就是这样的……
就是你说的那个意思,只是规定可以写成这样而已,因为方便,否则的话你没办法得到常量字符串的首地址,她不像字符数组,你可以用 &a[0] 拿到地址。