字符串为什么可以赋值给指针?

作者&投稿:阿勤 (若有异议请与网页底部的电邮联系)
C语言中,为什么字符串可以赋值给字符指针变量?~

在C语言中并没有字符串这个类型。所说的字符串就是字符数组。也就是char类型的数组。
与普通数组不同的,字符串必须以'\0'作为结束符。
而在C语言中,类型为T的一维数组,其首地址等效于该类型的一维指针,即T*型。
于是字符串,也就是字符数组,首地址就可以当做char *型使用了。
事实上,在库函数以及大多数使用到字符串作为参数的函数中,其参数都是char *型的。

设有定义char s[200];
以下均可给它赋值:
定义时赋值:
char s[200]="Good Moring!";
char s[200]={'H','e','l','l','o'};
运行时赋值:
1)
for(int i=0;i<26;i++)
s[i]='A'+i;
s[i]=0;
2)
for(int i=0;(s[i]=getchar())!='
';i++);
s[--i]='\0';
3)
int i=0;
scanf("%c",&s[i]);
while(s[i]!='
')
scanf("%c",&s[i++]);
s[--i]='\0';
3)
gets(s); //输入的一行不超过199字符
4)
strcpy(s,"Good Morning!"); //需包含头文件string.h

简单说“abc”是字符串常量,C中没有字符串变量,所以在存放字符串常量时一般采用字符数组来存储。

实际上数组是一个连续的存储空间,这里记录着两个重要的量:首地址和空间大小。首地址用数组名a来记录,尔空间大小用a的下标与数组元素的大小的乘积来表示。

但对于字符串往往不关心到底占用多大的存储空间,只知道是字符串就可以了。做处理的时候“abcde”和“abcdefgh……z”的过程是一样的,反正最后都是字符串结束标志'\0',所以字符按串的长度显得不是特别重要。这也是为什么char a[]="abc";中并不指定a数组的长度。

因此往往只要记录字符串的首地址就可以了。而指针正是记录地址的不二人选。

所以,对于老手在做字符串的题目的时候,不关心其长度,只要记录下首地址就OK了。定义形势就是char *p="abc";

本质上char a[]="abc";和 char *p="abc"; 是一样的。

char *p="abc";

也是在内存开辟一连续存储单元,将abc放在里面,
而p就指向了这块存储单元的首地址

而且这块存储单元的大小就是4个字节,包含结束符 \0
如果程序后边将p 指向别处那麽 这块4字节的存储单元就会被丢失,
在程序中无法再被访问到

char *p="abc";
在内存先开辟一块连续空间存放"abc",然后将存放"abc"的内存地址的首地址赋值给指针p。

char *p="abc"
先在内存开辟一连续存储单元,然后把字符串存放到这些存储单元去,再把存储单元的首地址给P
不就少了个存储单元的变量名吗,想得太复杂了

指针指向字符串地址


C语言中,为什么字符串可以赋值给字符指针变量
字符串在内存的存放是以字符为单位存放的;字符指针变量,只要是指向的地址是存放字符类型,那么就就符合语法的;字符串是把首地址,赋给了指针变量

C语言中,为什么字符串可以赋值给字符指针变量
因为字符串本质上是一个char数组,任何类型的数组都可以赋值给相同类型的指针变量

字符串为什么可以赋值给指针?
简单说“abc”是字符串常量,C中没有字符串变量,所以在存放字符串常量时一般采用字符数组来存储。实际上数组是一个连续的存储空间,这里记录着两个重要的量:首地址和空间大小。首地址用数组名a来记录,尔空间大小用a的下标与数组元素的大小的乘积来表示。但对于字符串往往不关心到底占用多大的存储空...

C语言字符串指针为什么能赋值?
char *p是定义一个指针,“abcd”是存储在rodata段的,指针指向“abcd”,并不是赋值。而且这种定义本身有问题,应该加const,因为*p指向rodata段,内容不能改变,如果没加const的情况下,若再定义p[0] = ‘c’;此时编译通过,但执行程序时就会出错。所以一般在定义字符串指针时加上const,遇到p[...

为什么字符串可以赋值给字符指针变量
不是把字符串赋值给指针变量。是把字符串首地址赋值给指针变量。也就是字符串数组第一个元素的地址。

C语言,char *a;a="abc"abc为什么可以直接赋值给a?a分配动态内存_百度...
;就非常好了。在a是char *型指针时,a="abc";的意思不是将字符串abc赋给a,而是“创建一个常字符串abc,并将首地址(第一个字符的地址,这里就是a的地址)赋给指针变量a。以后就可以通过指针a来操作字符串abc了,这里指针a也不能再让它指向别处,否则abc就再也找不到了……希望能帮到你。

为什么字符串不可以直接用等于号赋值,只能
在C语言中,字符串是以字符数组形式存储的,并约定以\\0作为结束符。所以字符串赋值不能直接用=赋值,而是要用专门的函数进行复制,在C语言中,这个函数为strcpy。1 函数名 :strcpy 2 形式:char strcpy(char dst,const char src);3 头文件:string.h 4 功能:将src中的字符串复制到dst中,并...

string类是 final 类 为什么 string类可以被实例化 并且可以赋值
当然可以实例化啦。final类是不能被其他类继承而已。是可以赋值的,不过只能赋值一次而已。String 就是常量。String a = "aaa";a = "bbb"a变量并不是重新赋值,只是指向另一个字符串而已。字符串"aaa"、"bbb"不可以更该的。

字符串数组怎么进行赋值?
1、首先可以使用String[] s=new String[6],定义一个长度为6的字符串数组,定义之后,可以对字符串数组进行赋值,如下图所示。2、使用int[] i=new int[6],定义一个长度为6的整型数组,其它类型类似,如下图所示。3、也可以在定义数组的时候,直接对数组进行赋值,使用String[] str=new String...

C语言中,字符串为什么不能直接用等于号赋值给一个变量。 例如 int...
等号当然可以用赋值,赋值就是把等号左边值的赋给右边,之所以你写的不对是因为你的数据类型不对。a是int型,即整数型的,例如 你可以让 a= 3 意思是把3赋给a, 但不能让一个字符串赋给a,所以你那样赋值肯定会报错。c语言没有专门用于储存字符串的变量类型,字符串都是被储存在char类型的...

安泽县13419087709: 字符串为什么可以赋值给指针? -
当涂蚂万氏: char *p="abc";也是在内存开辟一连续存储单元,将abc放在里面, 而p就指向了这块存储单元的首地址而且这块存储单元的大小就是4个字节,包含结束符 \0 如果程序后边将p 指向别处那麽 这块4字节的存储单元就会被丢失, 在程序中无法再被访问到

安泽县13419087709: C语言中,为什么字符串可以赋值给字符指针变量 -
当涂蚂万氏: 因为字符串指针指示指向该字符串的首地址,字符串的实际位置并不会改变

安泽县13419087709: C语言字符串指针为什么能赋值? -
当涂蚂万氏: char *p是定义一个指针,“abcd”是存储在rodata段的,指针指向“abcd”,并不是赋值.而且这种定义本身有问题,应该加const,因为*p指向rodata段,内容不能改变,如果没加const的情况下,若再定义p[0] = 'c';此时编译通过,但执行程序时就会出错.所以一般在定义字符串指针时加上const,遇到p[0] = 'c';的情况下,在编译时就会报错,以便程序员修改!

安泽县13419087709: c++中的字符串常量为什么可以赋值给char -
当涂蚂万氏: 因为字符串常量实际上是 const char *,给char赋值的话会进行一个强制类型转换,即使在某些编译器上可以通过,实际上出来不会是你想要的那个效果.

安泽县13419087709: char *c="chen xi";为什么可以把字符串赋值给指针变量? -
当涂蚂万氏: "chen xi"的类型是const char * , 编译器在编译时会在常量区为"chen xi"分配空间存储这个字符串,然后将字符串的首地址赋给字符指针char * c 至于能将const char * 赋给 char * c, 是因为在c语言时代,这已成为一种习惯的写法. 所以,当使用指针c试图改变"chen xi"时,如:c[0]='a'; 编译并不会出错,但运行时会出错.

安泽县13419087709: 为什么C语言字符串常量可以当做指针 -
当涂蚂万氏: C中的字符串常量以第一个字符的存放地址作标记,它本身就是一个地址常量,这个地址常量只能作“指针右值”,并不是指针变量……

安泽县13419087709: c++中的字符串常量为什么可以赋值给char*? -
当涂蚂万氏: C中"hello"类型是char[6],所以允许char* str="hello"; 你甚至可以接着使用 *str = "d" 这样赋值,编译通过没问题只不过会在运行时报错,因为"hello"位于只读存储区不允许写操作.C++中"hello"的类型是const char[6],不过为了兼容C代码做了特殊处理,所以也允许赋值给char*指针.

安泽县13419087709: C语言为什么可以赋给一个指针以常量? -
当涂蚂万氏: char *s; s="BOOK" 是对的,s保存字符串常量的地址,用while(*s)循环时,最后一个字符通过*解引后是\0,循环退出.char s[10]; s="BOOK"是不对的,s是数组内存的首地址,首地址是不能改的,只能访问,不能将字符串常量的地址赋给S ,就算能赋,你想啊,原来s是保存数组的地址,你赋值后,就变成了字符串常量的地址,那数组的内存不就不能访问了,这是不允许的,

安泽县13419087709: 为什么指向字符的指针能够赋值一个字符串 char *aptr; *aptr=“abcdefg” -
当涂蚂万氏: 1、*aptr=“abcdefg”这个应该是错误的,应该是aptr=“abcdefg”,否则编译器会报错,因为*aptr是一个char类型,不能将字符串指针赋值给字符类型. 2、char *a[5];表示是一个数组,该数组大小为5,其每个元素都是一个字符指针,实际上a就是一个指针类型的数组.

安泽县13419087709: 如何理解字符串赋值给指针与数组的区别 -
当涂蚂万氏: 1、字符串,可以理解为一个常量指针(地址),该指针中的内容为一串连续的字符2、char *s1="hello" ; //字符串赋值给指针, 这表示s1与"hello"字符串指向同一个地址 这种形式也可以写成如下:char *s1 ; //定义一个指针变量 s1="hello"; //给指针变量赋值3、char s2[]="hello"; //字符串赋值给数组,这种形式,只能在变量s2定义时才可以出现,无法分开来写.表示将"hello"中的字符hello存放到s2数组中(包含字符串结束符在内).

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网