char *与char []深度刨析

编译不能通过

#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指定内存地址,所有会发生未知的异常;但若指定了内存位置或初始化数值,则没有任何问题。

时间: 2024-10-06 11:29:37

char *与char []深度刨析的相关文章

深度刨析-reduxTodo

昨天我们讲到了怎么去简单的构建一套完整的redux体系,今天我以一个简单的实例去讲解reduxTodo用ES6+webpack+redux怎么去实现数据流动,还有需要注意的地方.好的,言归正传,让我们开始吧! 首先我们看一下完整的文件目录,一个简单的todo我们只做删除和添加两个功能 再贴一下完整的示例图 首先说一下如果我们不使用redux怎么去实现简单的删除功能呢,我们把上图分为两个组件部分,分别是Header和section部分,header部分包括的是输入框和h1部分,section部分我

string char * const char *之间的互相转换

string  ->   const char * 用str的c_str()方法或者data()方法均可,这个两个方法返回值为cong char * string str = "hello"; const char *a = str.c_str(); const char *b = str.c_str(); const char *  ->  string const char*转换为 string,直接赋值即可 string  ->  char * vs不让用str

[转载]char * 和char []的区别---之第一篇

char *  和char []的区别---之第一篇 原文地址http://blog.csdn.net/yahohi/article/details/7427724 在C/C++中,指针和数组在很多地方可以互换使用,所以经常有一种错觉,感觉数组和指针两者是完全等价的,于是经常出现在定义char ch[] 时,一旦给ch赋值与ch开辟的地址空间不等长的空间时会出现打印为“烫”字的情况 实上数组和指针是有很大的区别的. 汇总自己查找的资料: char[]是一个数组定义,char*是指针定义 先说说指

有个函数:char* reverse(char *buf)

*Author : DavidLin *Date : 2014-12-15pm *Email : [email protected] or [email protected] *world : the city of SZ, in China *Ver : 000.000.001 *For : reverse the char array/string! *history : editor time do * 1)LinPeng 2014-12-15 created this file! * 2

const char*、char*、char* const、char[]、string的区别

1.const char* p: p is a pointer to const char(char const* p 一样)   意思就是不能通过p指针来修改p指向的内容(但是内容可以修改).2.char* p      : p is a pointer to char   意思就是可通过p指针来修改p指向的内容3.char* const p: p is a const pointer to char   意思就是p指针是一个常指针,他指向的内存地址不能变,定义的时候就得初始化   一旦给指针

char * 与char []探究理解

问题引入 以前一直认为二者是一样的,今天突然发现他们还是有很大的不同的.例如char *a = "abc"和char b[] = "abc",当我使用strcat(b,a)时得到的b是二者的结合,当我使用strcat(a,b)时系统报错.也就是说前者改变其内容程序是会崩溃的,而后者完全正确. 预备知识 内存分配的三种方式方式:静态存储区.堆区和栈区.它们的功能不同,使用方式也就不同. 1.静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存

const char*, char const*, char*const的区别

Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读. char * const cp; ( * 读成 pointer to ) cp is a const pointer to char const char * p; p is a pointer to const char; char const * p; 同上因为C++里面没有const*的运算符,所以const只能属于前面的类型. C++标准规定,const关键字放在

char* 和char[]的差别

下面内容均来自互联网,系笔者汇总并总结. 1. 问题介绍 问题引入: 在实习过程中发现了一个曾经一直默认的错误,相同char *c = "abc"和char c[]="abc",前者改变其内 容程序是会崩溃的,而后者全然正确. 程序演示: 測试环境Devc++ 代码 #include <iostream> using namespace std; main() { char *c1 = "abc"; char c2[] = "

C语言中char* 和 char []区别

想要把丢掉的东西捡起来,还是很辛苦啊,今天我就发现,我连char* 和 char []的区别都不知道. 很多人觉得这两个定义效果一样,其实差别很大.以下是个人的一些看法,有不正确的地方望指正. 本质上来说,char *s定义了一个char型的指针,它只知道所指向的内存单元,并不知道这个内存单元有多大,所以:当char *s = "hello";后,不能使用s[0]='a':语句进行赋值.这是将提示内存不能为"written".当用char s[]="hel