字符串常量指针与字符数组的区别
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)
{
...
}
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。
(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)
{
...
}
相关文章推荐
- char * 与 char [] 区别,char *[] 与 char[][]区别。字符串指针的数组与二维char数组区别。字符串常量赋予指针与字符数组区别。"字符串"等价于其首元素"字"的地址
- C语言字符串指针与字符数组的区别
- 堆 栈 字符数组 字符指针的区别
- 二级指针和字符指针数组的区别
- 字符数组 字符指针 sizeof strlen 的区别
- 字符指针 与 字符 数组的 区别 !!!!
- 常量字符串与非常量字符串 字符数组与字符指针
- 字符串指针和字符数组的区别
- 字符串指针和字符数组的又一区别
- C语言字符串指针变量与字符数组的区别
- 字符串指针与字符数组的区别
- 字符串指针变量与字符数组的区别
- 字符数组与字符指针区别
- C中常量字符串和字符数组的区别
- 字符指针变量和字符数组的区别
- 字符串指针与字符数组区别(二)--字符串输出与指针的相加减
- c语言中字符数组和字符指针的区别
- C语言 字符指针和字符数组的区别
- 区分 :字符指针变量和字符数组的区别和联系
- 字符数组 字符指针 字符串常量