编译不能通过
#include "iostream" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { char *p= "hello" ; //不是把一个字符串赋给了一个字符型的指针,而是把一个字符型的指针指向了字符串的首地址。 strcpy(p,"hel"); cout << p << endl; return 0; }//编译通不过
解析:char*p= "hello";实际上是constchar
*p= "hello";里面的内容是不能改变的,所以编译通不过。
字符数组整体赋值问题
chara[10]="hello";//这种写法完全正确,初始化的方式,看似左值是个字符串,其实不然,它其实是个初始化列表。最后列表包含\0。
chara[10]; a[10]="hello";//这种写法错误,一个字符不能容纳一个字符串,况且a[10]也是不存在的!
chara[10]; a="hello";//这种写法是错误的,也是不允许的,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱。
chara[10]; strcpy(a, "hello");//这种写法正确,也是推荐使用的方式
字符数字的比较:不能使用“==”来进行比较,只能用strcmp()函数来处理
解析:在C语言中把字符串当作数组来处理,因此,对字符串的限制方式和对数组的一样,特别是,它们都不能用C语言的运算符进行复制和比较操作。直接尝试对字符串进行复制或比较操作会失败。
charstr1[10], str2[10];
str1= "abc"; /*** WRONG ***/利用=运算符来把字符串复制到字符数组中是不可能的
str2= str1; /*** WRONG ***/利用=运算符来把字符串复制到字符数组中是不可能的
charstr1[10] = "abc";/*** RIGHT ***/因为在声明中,=不是赋值运算符。
if(str1==str2) /*** WRONG ***/这条语句是把str1和str2作为指针来进行比较,而不是比较两个数组的内容。因为str1和str2有不同的地址,所以表达式str1
== str2的值一定为0。
数组与字符串在机器中的存储
数组:机器中,当被定义时char a[10];就已经分配好了内存空间,放在了数据段堆栈中,其中的数值是可以进行修改的。
字符串:字符串在内存被存放在了数据常量段中,但是字符串又称为字符串常量,是编译器“钉死”无法修改的,所以*p
= ‘z‘;想改变字符串的值是不被允许的。
举例:char *a = "world "和charb[]="hello "的区别
+---+---+---+---+---+---+
b:|h|e | l | l | o|\0|
+---+---+---+---+---+---+
+-----++---+---+---+---+---+---+
a:|*======>|w|o|r|l|d|\0|
+-----++---+---+---+---+---+---+
1,a与b类型不同:a为指向字符串常量的指针;b为保存字符串的数组
2,"hello"和"world"字符串保存的位置不同。"world"保存在堆栈中,其中的只可以修改(b[3]
= ‘f‘;);"hello"保存在全局数据区,位置是在.rodata中,不能修改(a[3]
= ‘a‘;错误)。
3,a是全局数据区,b是函数的栈空间区域,函数执行完成,这个空间可就没了。所以,return
a;是可以的而return b;就很危险了。
4,2种情况下,数组名不可等同视为数组指针,&与sizeof操作符:
&a取得是指针变量的地址,而非字符串"world"的首地址;&b取得就是字符串"hello"的首地址。
“siziof”的区别:
sizeof(s1); //return 4, pointer size
sizeof(s2); //return 6, array size
数组名首地址和取数组首地址区别
数组名表示数组的入口地址,这一点与函数名,结构体标识等类似。
char a[10];那么a表示的是这个数组第一个元素的地址,即&a[0];
而&a;表示的是这个数组的首地址。
估计不少人这个时候糊涂了,这两个有区别吗?数值不一样么?
它们两个的数值是一样的,因为地址只有一个,数组的一个元素的地址的值就是这个数组的地址的值,那么为什么还要分这么细致呢?下面举个例子
char a[10]; char *p = NULL; char (*p_a)[10] = NULL; p = a; p_a = &a;
未提前分配内存的情况
1)请问以下代码有什么问题:
int main()
{
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;
}
答案:没有为str分配内存空间,将会发生异常问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃
2)char *s; strcpy(s,"hello");是不正确的为什么不对?
如果s没有分配内存空间
strcpy(s, "hello")就会导致内存访问的异常
可以用 s = (char*)malloc(10);//分配10字节的内存给s
或 s = new char[10];//紧限于C++语言
3)请问如下语句有问题吗?
char *a;
string b=a;
解析:因为没有提前为a指定内存地址,所有会发生未知的异常;但若指定了内存位置或初始化数值,则没有任何问题。