c语言字符串和指针的关系,c语言字符串和指针
用指针实现的字符串:
#包含stdio.h
int main(void){
char * p= vv
printf(p=%s\n ,p);
p=猫;
printf(p=%s\n ,p);
返回0;
}运行结果:
char * p= vv
printf(p=%s\n ,p);用指针实现的数组p:
p是一个指向char变量的指针变量,它的初始值是字符串文字“vv”。通过判断一个字符串的字面量,可以得到一个指向该字符串字面量的第一个字符的指针。所以P被初始化为指向存储在内存中的字符串文字“vv”的第一个字符串“v”的指针。
使用指针实现字符串的错误声明:
char * p={v , v , c , a , \ 0 };{}形式的数组初始值不能用于单个变量。
在内存空间中,指针P和字符串文字“vv”都占用内存空间。
#包含stdio.h
int main(void){
char * p= vv
printf(p=%s\n ,p);
printf(sizeof(p)=%u \n ,sizeof(p));
printf(sizeof(vv)=%u \n ,sizeof( vv );
返回0;
}运行结果:
p指针占用的空间是sizeof,即sizeof (char*)字节,其长度因编译器而异。
因此,用指针实现的字符串比用数组实现的字符串需要更多的内存空间。
char * p= vv
printf(p=%s\n ,p);
p=猫;
printf(p=%s\n ,p);用数组实现的字符串和用指针实现的字符串之间的区别是:
您可以将指向字符串文字(中的字符)的指针分配给其他字符串文字(中的字符)。赋值后,指针指向新的字符串文字(中的字符)。
注意:
P中的字符串被更改,但字符串没有被完全复制。在内存中,指针指向“vv”,无法访问,成为无法清除的垃圾。因为字符串文字具有静态内存,所以当不需要它们时,它们不会自动从内存空间中清除。
#包含stdio.h
int main(void){
char str[]= 2020 ;
printf(str=%s\n ,str);
str= 07/08 ;//此赋值方法不能在字符串数组中使用。编译错误
printf(str=%s\n ,str);
返回0;
}字符串数组直接赋给数组变量,下面三种是错误的赋值方法:
char str[6];
str={V , V , c , a , \ 0 };str=" VVcatstr={ " vv cat " };#包含stdio.h
#定义透镜6
int main(void){
int I;
char a[][LEN]={2020 , 7 , vv cat };
char *p[]={2020 , 7 , vv cat };
for(I=0;i3;i ){
printf(a[%d]=%s ,sizeof(a[%d])=%u \n ,I,a[i],I,sizeof(a[I]));
}
puts(-);
for(I=0;i3;i ){
printf( p[% d]= % s sizeof(p[% d])=% u \ n ,I,p[i],I,sizeof(p[I]));
}
puts(-);
printf(sizeof(p)=%u \n ,sizeof(p));
printf(sizeof(2020)=%u \n ,sizeof( 2020 );
printf(sizeof(7)=%u \n ,sizeof( 7 );
printf(sizeof(vvcat)=%u \n ,sizeof( vv cat );
返回0;
}运行结果:
可以看出,二维数组和指针数组虽然可以存储多个字符串,但本质是完全不同的。一种是在定义字符串的时候已经分配了存储字符串的空间,另一种是只定义了指向字符串的指针,没有存储字符串的空间。你现在需要给它一个指针,将字符串存储在相应的位置,指针也占用了一定的内存空间。
转载请联系作者授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。