您的位置:首页 > 其它

字符串常量指针与字符数组的区别

2011-09-20 22:04 204 查看
转自:http://hi.baidu.com/zengzhaonong/blog/item/b50db67774cb5318b151b93a.html

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。

(1) 修改内容上的差别

char a[] = "hello";

a[0] = 'X';

char *p- = "world";
//注意p指向常量字符串

p[0] = 'X'; //编译器不能发现该错误,运行时错误

(2) 用运算符sizeof可以计算出数组的容量(字节数)。sizeof(p),p为指针得到的是一个指针变量的字节数,而不是p所指的内存容量。C++/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

char a[] = "hello world";

char *p = a;

cout<< sizeof(a) << endl; //12字节

cout<< sizeof(p) << endl; //4字节

计算数组和指针的内存容量

void Func(char a[100]) {

cout<< sizeof(a) << endl; //4字节而不是100字节

}

sizeof 指针 数组

-------------------------------------------

char p[]; // 编译不过

char p[0]; // sizeof(p) = 0

char p[8]; // sizeof(p) = 8

char * p = malloc (10); // sizeof(p) = 4

用运算符sizeof可以计算出数组的容量(字节数),但是计算不出指针指向空间的容量,只能计算出指针变量的空间容量(4字节)

指针就是指针,成不了数组

《C陷阱和缺陷》P41

----------------------------------------------

在C语言中,我们没有办法可以将一个数组作为函数参数直接传递。如果我们使用数组名作为参数,那么数组名会立即被转换为指向该数组第1个元素的指针。例如,下面的语句:

char hello[] = "hello";

声明了hello是一个字符数组。如果将该数组作为参数传递给一个函数,

printf ("%s\n", hello);

实际上与将该数组第1个元素的地址作为参数传递给函数的作用完全等效,即:

printf ("%s\n", &hello[0]);

因此,将数组作为函数参数毫无意义。所以,C语言中会自动地将作为参数的数组声明转换为相应的指针声明。也就是说,像这样的写法:

int strlen (char s[])

{

...

}

与下面的写法完全相同:

int strlen (char *s)

{

...

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: