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

原文:C语言中char* 和 char []区别

想要把丢掉的东西捡起来,还是很辛苦啊,今天我就发现,我连char* 和 char []的区别都不知道。

很多人觉得这两个定义效果一样,其实差别很大。以下是个人的一些看法,有不正确的地方望指正。

本质上来说,char *s定义了一个char型的指针,它只知道所指向的内存单元,并不知道这个内存单元有多大,所以:
当char *s = "hello";后,不能使用s[0]='a';语句进行赋值。这是将提示内存不能为"written"。
当用char s[]="hello";后,完全可以使用s[0]='a';进行赋值,这是常规的数组操作。
若char s[] = "hello";
char *p = s;
也可以使用p[0] = 'a';因为这是p ==s,都是指向数组的指针。
下面看另外一种定义:
char *s = (char *)malloc(n(www.111cn.net));//其中n为要开辟空间的大小
这句话其实相当于:
char s[n];定义的也是一个指向数组的指针,便可进行数组的下标操作

例子

代码如下 复制代码
#include <stdio.h>

int main(int argc, char* argv[]) {
char* buf1 = "this is a test";
char buf2[] = "this is a test";
printf("size of buf1: %d\n", sizeof(buf1));
printf("size of buf2: %d\n", sizeof(buf2));
return 0;
}

结果是:

$ > ./main
size of buf1: 4
size of buf2: 15

from:http://www.111cn.net/net/c/66247.htm

相关内容

时间: 2024-10-04 02:02:31

C语言中char* 和 char []区别的相关文章

如何解决:输入输出-c语言中&amp;amp;#39; &amp;amp;#39;,与&amp;amp;#39; &amp;amp;#39;的区别?

问题描述 c语言中' n',与' '的区别? 今天没事写了段代码. #include main() { int c; while(c=getchar())!='n' putchar(c); } 这里只能输入输出一次,就退出循环了. 而我这样写 将while(c=getchar())!='n'改为while(c=getchar())!='' 这样就可以多次循环输入输出了而我又将上面的改为while(c=getchar())!=EOF 则不能输出了. 请问这几个是为什么? 谢谢! 解决方案 首位是n

C语言中char*和char[]用法区别分析_C 语言

本文实例分析了C语言中char* 和 char []的区别.分享给大家供大家参考之用.具体分析如下: 一般来说,很多人会觉得这两个定义效果一样,其实差别很大.以下是个人的一些看法,有不正确的地方望指正. 本质上来说,char *s定义了一个char型的指针,它只知道所指向的内存单元,并不知道这个内存单元有多大,所以: 当char *s = "hello";后,不能使用s[0]='a':语句进行赋值.这是将提示内存不能为"written". 当用char s[]=&q

C语言中的BYTE和char深入解析_C 语言

例如,在下面的源程序中""""之内的"你"."好".","."C"."!"."\n"就属于程序要处理的字符. 复制代码 代码如下: #include <stdio.h>int main(void){      printf("你好,C!\n");         return 0;}    该源程序中的其他字符则属于

语言 指针类型-C语言中, 指针类型char*有什么意义。

问题描述 C语言中, 指针类型char*有什么意义. C语言中,void*与char*之类的指针类型相比,有什么特殊的用途? 解决方案 如果定义成 void * 时,就无法取指针中的数据,因为数据类型不明确. 想要取 void * 中的数据,需要转换成想要的类型指针,如 char * 或 int * . 一般 void * 做参数参数时使用,可以接受 char * 或 int * 等其它类型指针的传入.如果定义成 char * 等固定类型,则无法接收除 char * 外的其它类型指针. 解决方案

详解C语言中的char数据类型及其与int类型的转换_C 语言

C语言中的char变量 char是C/C++整型数据中比较古怪的一个,其它的如int/long/short等不指定signed/unsigned时都默认是signed.虽然char在标准中是unsigned(因为char类型提出的初衷是用来表示ascii码,ascii码的范围是0~127),但实际情况中究竟是signed还是unsigned取决于编译器. 可通过下面程序判断编译器的默认char类型: void char_type() { char c=0xFF; if(c==-1) printf

C语言中printf(),sprintf(),scanf(),sscanf()的用法和区别

以下是对C语言中printf(),sprintf(),scanf(),sscanf()的用法以及区别进行了详细的分析介绍,需要的朋友可以参考下   printf语法: #include <stdio.h> int printf( const char *format, ... ); printf()函数根据format(格式)给出的格式打印输出到STDOUT(标准输出)和其它参数中.返回值是输出的字符数量.sprintf语法: #include <stdio.h> int spri

C语言中NSInteger,NSNumber以及Int的区别

NSInteger和NSNumber   首先:NSInteger,NSNumber并没有什么关系,更不要想当然的以为二者还有什么继承关系,甚至还有人问NSInteger是不是NSNumber的子类?答案当然是NO!!!NSInteger只是一个基本的数据类型,而NSNumber是OC的对象,并且NSNumber继承自NSValue,NSValue又继承自NSObject. 既然 NSInteger是基本类型,那么,使用起来就非常简单. 声明一个变量, NSInteger myInt: 直接赋值

C语言中的strdup()函数和其与strcpy()函数的区别_C 语言

头文件: #include <string.h> 定义函数: char * strdup(const char *s); 函数说明:strdup()会先用maolloc()配置与参数s 字符串相同的空间大小,然后将参数s 字符串的内容复制到该内存地址,然后把该地址返回.该地址最后可以利用free()来释放. 返回值:返回一字符串指针,该指针指向复制后的新字符串地址.若返回NULL 表示内存不足. 范例 #include <string.h> main(){ char a[] = &

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

const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目. 这个知识易混点之前是看过了,今天做Linux上写GTK程序时又出现个Warning,发散一下又想到这个问题,于是翻起来重嚼一下. 事实上这个概念谁都有只是三种声明方式非常相似: Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读. char * const cp; // * 读成 pointer to //