字符串赋值给字符指针变量

char *p,a=‘5‘;

p=&a;                     //显然是正确的,
p="abcd";              //但为什么也可以这样赋值??

双引号做了3件事:

1.申请了空间(在常量区),存放了字符串 
2. 在字符串尾加上了‘/0‘    
3.返回地址

这里就是 返回的地址  赋值给了  p                      

char *p = “hello”;

把p换成数组,然后再赋值就不行

字符串常量"hello"出现在一个表达式中时,"hello"表达式使用的值就是这些字符所存储的地址(在常量区),而不是这些字符本身。

所以,可以把字符串赋值给指向字符的指针p,而不能把字符串赋值给一个字符数组。

char a[10] = “hello”; //这样可以,这种情况是c语言初始化所支持的

如果写成char a[10]

然后 a = “hello” 这样就错误了。

同样是a数组,char a[10] = “hello”;这种是数组的初始化,和a[0] = ‘h’ a[1] = ‘e’…是一个道理

但是换成char a [10]

然后a = “hello”就不行了 “hello”赋值的值是一个地址,而a虽然也有地址,但是这与指针是不一样

的,指针的值是地址,而数组的值虽然也是地址,但是却是一个常量,所以不能给常量赋值。

以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写
"abc",那么编译器帮你存储的是"abc\0"

"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";写在函数体内,那么虽然这里的"abc\0"被放在常量区中,
但是ptr本身只是一个普通的指针变量,所以ptr是被放在栈上的,只不过是它
所指向的东西被放在常量区罢了。

数组的类型是由该数组所存放的东西的类型以及数组本身的大小决定的。
如char s1[3]和char s2[4],s1的类型就是char[3],s2的类型就是char[4],
也就是说尽管s1和s2都是字符数组,但两者的类型却是不同的。

对于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*。

char *s1=“string1”;//定义字符串常量,指针形式

char s2[]=“string2”;//定义字符串常量,数组形式

char *s3=new char[10];//定义字符串变量并分配内存 指针形式

strcpy(s3,"string3");//为s3赋值

char s4[10];//定义字符串变量,数组形式

strcpy(s4,"string4");//为s4赋值

以上方法都能定义一个字符串,同时通过字符串在内存中的分布可以清楚地知道是什么情况

C语言中字符串赋值方法strcpy(char*d,char*s)其中s代表是源字符串,d代表目标字符串,也就是要赋值的字符串。

在c语言中,比如char *p,其中p是一个指针,p中存储一个内存缓冲区的首地址。所谓的内存缓冲区就是一段
连续的内存地址,里面存放了一系列的字符。那系统又是如何判断在哪里结束呢。那就是根据符号‘\0’。这个
字符占一个字节,8位,每位的值都是0。

原文地址:https://www.cnblogs.com/yanxutao/p/9253245.html

时间: 2024-10-09 00:36:39

字符串赋值给字符指针变量的相关文章

C语言中,为什么字符串可以赋值给字符指针变量

转载于:http://www.cnblogs.com/KingOfFreedom/archive/2012/12/07/2807223.html 本文是通过几篇转帖的文章整理而成的,内容稍有修改: 一. char *p,a='5';p=&a;                     //显然是正确的,p="abcd";              //但为什么也可以这样赋值?? 问:一直理解不了为什么可以将字串常量赋值给字符指针变量,请各位指点! 答: 双引号做了3件事:  1.

关于指针 用字符数组,字符指针变量输入字符串 动态为字符型指针变量分配内存

#include <stdio.h> #include <iostream> #include<math.h> using namespace std; int main() { //声明字符型数组和指针变量 char str[10]; char *strip=str; //输入输出 cout<<"str="; cin>>str; //用字符数组输入字符串 cout<<"str="<<

指针系统学习5-对使用字符指针变量和字符数组的讨论

虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈-- 主要概括起来有以下几点: 1. 字符数组由若干个元素组成,每个元素中  放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是将字符串放到字符指针变量中. 2. 赋值方式.对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值.     char  str[20];     str=″I love Fishc.com!″;    而对字符指针变量,可以采用下面方法赋值:  

对使用字符指针变量和字符数组的讨论

区别:1.字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第一个字符的地址). 2.赋值方式.对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值:char str[20]; str="I love China";而对字符指针变量,可以用如下方法赋值:char *a; a="I love China ";注意,赋值给a的不是字符,而是字符串的第一个元素的地址. 3.对字符指针变量赋初值:char *a="I lov

c语言之字符指针变量和字符数组的异同

1.字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第一个字符的地址),而不是将字符串放到字符指针变量中. 2.赋值方式.对字符数组只能对各个元素进行赋值,不能用以下办法对字符数组进行赋值. char str[20]; str = "ni hao a"; 而对于字符指针变量,可以采用以下方式赋值: char *a; a = "ni hao a"; 但需要注意的是赋值给a的不是字符,而是字符串中第一个元素的地址. 3.如果定义了一个

字符串比较、字符指针和字符串的存储位置

字符指针==的意义:判断两个指针是否指向同一地址 字符指针存在栈里,字符串存在字符数组里(静态数组在栈里)或者在字符常量区,字符常量区没有重复的字符串 int main() { char *s1 = "abc";//s1在栈上,"abc"在字符常量区,s3也指向这个"abc" char *s3 = "abc"; char s2[] = "abc";//"abc"在栈上 char *s4

字符串常量与 字符指针,字符数组

1. 字符串的定义(1) char buf[10] = "hello"; //定义了10个字节的数组,但只用了6个字节存放字符串(2) char *str = "hello"; //此处hello是字符串常量,存储在长常量区,把首地址传给指针变量 sts(3) char *s = "hello"; // 指针s 与 指针str的内容都是指向字符串常量“hello” 其值相等:(4) char buff[] = "hello";

字符数组VS字符指针

最近复习数据结构实验时,碰到这么一行代码,看的有点不爽. typedef char** HuffmanCode; 借此梳理下数组和指针. int* p; //指针变量p中存的地址代表的内存单元中的数据是整型 在32位平台下,由于p存的是地址,故p的值是32位. 不论p指向什么类型的数据,指针变量p本身都是整型. c中没有string类型,所以一般用字符数组表示字符串. char str[15] = "Hello World"; c规定数组名表示数组在内存中的首地址,就是str = &a

使用字符串指针变量与字符数组的区别

用字符数组和字符指针变量都可以实现字符串的存储和运算,但是两者是有区别的.在使用时,应注意以下几个问题: 1)   字符串指正变量本身是一个变量,用于存放字符串的首地址.而字符串本身是存放在该首地址的一块连续的内存空间中并以“\0”作为字符串的结束.字符数组是由若干个数组元素组成的,它可用来存放整个字符串. 2)   赋值方式.对字符数组只能对各个元素赋值,不能用以下方式对字符数组赋值. 对字符指针变量,可以采用下面方法赋值. 3)   字符数组由若干个元素组成,每个元素中放一个字符,而字符指针