字符数组和字符指针的区别
字符数组和字符指针的区别
首先**点,非常重要的一点:指针和数组是不同的两个类型!
我们从可以从C语言标准文档中得知:
ISO/IEC 9899:1999 – programing language c
6.2.5 Types
20 .
这说明了什么是数组类型
同样在20 .
说明了什么是指针类型。
在了解了两种类型的基础上,我们了解数组和指针的区别:
数组是一组相同类型对象的**,指针是对一个对象的引用。
它们在使用中表现出了一定的相同点,但不同点也是很多的:
1,数组直接储存对象,指针则是指向一个对象。
2,数组名不能被赋值,指针变量能。
3,sizeof一个数组,得到数组的长度(字节单位),sizeof一个指针,相当于sizeof(void*)。(注意,不同目标平台指针长度可能不同,所以sizeof(void*)是最准确的回答)
4,(可能是**内容,对于正确性就呵呵)指针是间接访问,数组是直接访问。
如果你对C语言有深入学习的想法,务必去了解一下C语言的ISO标准。
字符串数组与字符指针的区别
字符指针变量和字符数组的区别:简单说一下:字符串数组是用来存放字符串的数组,在内存中占一段连续的单元。所占内存存放的是字符串。
定义方法为:chara[N];N为常量表达式,可初始化。
字符指针是指向字符的指针,所占内存单元存放的是所指字符的内存单元。定义方法为:char*p;完整的解答:1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的地址(字符串**个字符的地址),决不是将字符串放到字符指针变量中2)赋值方式对于字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值:charstr[14];str=\”Iloveyou!\”;而对于字符指针变量,可采用如下赋值:char*a;a=\”Iloveyou!\”;赋值给a的是字符串**个元素的地址3)对字符指针赋初值char*a=\”Iloveyou!\”;等价于char*a;a=\”Iloveyou!\”;而对数组的初始化:charstr[14]={\”Iloveyou!\”};不等价于charstr[14];str=\”Iloveyou!\”;4)如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。
请教字符数组和字符串指针的区别
1.字符指针可以指向一个字符串。我们可以用字符串常量对字符指针进行初始化。
例如,有说明语句:char *str = \”This is a string.\”;是对字符指针进行初始化。
此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址。这里要注意字符指针与字符数组之间的区别。例如,有说明语句:char string[ ]=\”This is a string.\”;此时,string是字符数组,它存放了一个字符串。字符指针str与字符数组string的区别是:str是一个变量,可以改变str使它指向不同的字符串,但不能改变str所指的字符串常量。
string是一个数组,可以改变数组中保存的内容。2.实例:char *str, *str1=\”This is another string.\”;char string[100]=\”This is a string.\”;则在程序中,可以使用如下语句:str++; /* 指针str加1 */str = \”This is a NEW string.\”; /* 使指针指向新的字符串常量 */str = str1; /* 改变指针str的指向 */strcpy( string, \”This is a NEW string.\”) /* 改变字符串的的内容 */strcat( string, str) /* 进行串连接*作 */在程序中,不能进行如下*作:string++; /* 不能对数组名进行++运算 */string = \”This is a NEW string.\”; /* 错误的串*作 */string = str1; /* 对数组名不能进行赋值 */strcat(str, \”This is a NEW string.\”) /* 不能在str的后面进行串连接 */strcpy(str, string) /* 不能向str进行串** */3.其它说明:1) 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写:\”abc\”,那么编译器帮你存储的是\”abc\\0\”2) \”abc\”是常量吗?**是有时是,有时不是。不是常量的情况:\”abc\”作为字符数组初始值的时候就不是,如char str[] = \”abc\”;因为定义的是一个字符数组,所以就相当于定义了一些空间来存放\”abc\”,而又因为字符数组就是把字符一个一个地存放的,所以编译器把这个语句解析为 char str[3] = {\’a\’,\’b\’,\’c\’};又根据上面的总结1,所以char str[] = \”abc\”;的最终结果是 char str[4] = {\’a\’,\’b\’,\’c\’,\’\\0\’};做一下扩展,如果char str[] = \”abc\”;是在函数内部写的话,那么这里的\”abc\\0\”因为不是常量,所以应该被放在栈上。
是常量的情况: 把\”abc\”赋给一个字符指针变量时,如char* ptr = \”abc\”;因为定义的是一个普通指针,并没有定义空间来存放\”abc\”,所以编译器得帮我们找地方来放\”abc\”,显然,把这里的\”abc\”当成常量并把它放到程序的常量区是编译器最合适的选择。所以尽管ptr的类型不是const char*,并且ptr[0] = \’x\’;也能编译通过,但是执行ptr[0] = \’x\’;就会发生运行时异常,因为这个语句试图去修改程序常量区中的东西。记得哪本书中曾经说过char* ptr = \”abc\”;这种写法原来在c++标准中是不允许的,但是因为这种写法在c中实在是太多了,为了兼容c,不允许也得允许。
虽然允许,但是建议的写法应该是const char* ptr = \”abc\”;这样如果后面写ptr[0] = \’x\’的话编译器就不会让它编译通过,也就避免了上面说的运行时异常。又扩展一下,如果char* ptr = \”abc\”;写在函数体内,那么虽然这里的\”abc\\0\”被放在常量区中,但是ptr本身只是一个普通的指针变量,所以ptr是被放在栈上的, 只不过是它所指向的东西被放在常量区罢了。3) 数组的类型是由该数组所存放的东西的类型以及数组本身的大小决定的。
如char s1[3]和char s2[4],s1的类型就是char[3],s2的类型就是char[4],也就是说尽管s1和s2都是字符数组,但两者的类型却是不同的。4) 字符串常量的类型可以理解为相应字符常量数组的类型,如\”abcdef\”的类型就可以看成是const char[7]5) sizeof是用来求类型的字节数的。如int a;那么无论sizeof(int)或者是sizeof(a)都是等于4,因为sizeof(a)其实就是sizeof(type of a)6) 对于函数参数列表中的以数组类型书写的形式参数,编译器把其解释为普通的指针类型,如对于void func(char sa[100],int ia[20],char *p)则sa的类型为char*,ia的类型为int*,p的类型为char*7) 根据上面的总结,来实战一下:对于char str[] = \”abcdef\”;就有sizeof(str) == 7,因为str的类型是char[7],也有sizeof(\”abcdef\”) == 7,因为\”abcdef\”的类型是const char[7]。对于char *ptr = \”abcdef\”;就有sizeof(ptr) == 4,因为ptr的类型是char*。
对于char str2[10] = \”abcdef\”;就有sizeof(str2) == 10,因为str2的类型是char[10]。对于void func(char sa[100],int ia[20],char *p);就有sizeof(sa) == sizeof(ia) == sizeof(p) == 4,因为sa的类型是char*,ia的类型是int*,p的类型是char*。4.区别:(1)字符数组由若干个元素组成,每个元素中存放字符串的一个字符,而字符指针变量中存放的是字符串的首地址。(2)初始化方式不同。
对字符数组初始化要用static存储类别,在编译时进行。而对字符指针变量初始化不必加static,在实际执行时进行。(3)赋值方式不同。对字符数组不能整体赋值,只能转化成份量,对单个元素进行。
而字符指针变量赋值可整体进行。例如:char s[10];s= \\\”C++\\\”;/*错,s是常量,怎能被赋值*/(4)在定义一个字符数组时,编译时即已分配内存单元,有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,但该指针变量具体指向哪个字符串,并不知道,即指针变量存放的地址不确定。
例如:char a[10];char *p;scanf(\\\”%s\\\”,s);/*正确*/scanf(\\\”%s\\\”,p);/*非常危险,p的值动态*/(5)字符指针变量的值可以改变,字符数组名是一个常量,不能改变。
字符数组和字符指针变量的区别是啥呀?
数组是一个数据结构,指针是一种类型指向变量在内存里的位置,两者原本没有什么相同点,让大家容易产生他们直接有联系的错觉是因为c/c++语言标准中,使用数组名的时候会转换为指向数组**个元素的地址的指针。数组内储存的数据在内存中是连续的,所以下面代码中:char str[]={\’H\’,\’e\’,\’l\’,\’l\’,\’o\’,\’\\0\’};char* p1=str, *p2=&(str[0]);使用str[n]获取数组第n+1个数据的值,可以看作是这样进行的:先把str转换为首元素地址,也就是变为了获取到了指向\’H\’的指针,然后讲指针往后偏移n个单位,获得指向\’H\’往后数n个的字符。
C语言字符指针和字符数组的区别
字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\\0’作为串的结束。
c语言 字符数组 字符指针 sizeof strlen 的区别
简单概括,strlen()返回的是字符数组或者字符指针中的元素个数,sizeof返回的是字符数组中所有元素所占的总字节数,对于字符指针,返回的只是指针所占的字节数,32位系统上都是4字节。具体来说有如下几点区别:1.sizeof*作符的结果类型是size_t,它在头文件中typedef为unsignedint类型。
该类型保证能容纳实现所建立的**对象的字节大小。
2.sizeof是算符,strlen是函数。3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以\’\’\\0\’\’结尾的。4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。5.大部分编译程序在编译的时候就把sizeof计算过了,是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因。
charstr[20]=\”0123456789\”;//str是编译期大小已经固定的数组inta=strlen(str);//a=10;//strlen()在运行起确定,计算的是实际长度intb=sizeof(str);//而b=20;//sizeof()在编译期确定,str的类型是int[20],计算的是占据内存的大小6.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的实际长度,不是类型占内存的大小。7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个*作符不是个函数。
charc;sizeofc;//变量名可以不加括弧8.当适用于一个结构类型或变量,sizeof返回实际的大小,当适用一静态地空间数组,sizeof归还全部数组的尺寸。