C语言 浅谈数组和字符指针的赋值问题

在学习C语言的过程中,总是会遇到很多问题,不管它简单与否,了解到其本质问题就迎刃而解。以下我阐述的知识点,是我在编程学习中遇到问题,并查阅资料所总结的一点东西,可能会有不严谨或错误的地方,希望指出一起讨论。

错误一:

char str[10];
str = "hello";

以上代码,是绝对不被允许的,因为数组除了在声明时的初始化可以成块的把数据赋值给数组。其他任何时候都只能是单个的元素对其进行赋值(strcpy()函数内部的代码实现也是一个一个赋值,来达到复制字符串的目的的),也可以用循环的方式进行赋值,其本质都是单个赋值;

正确操作:

//方法一
char str1[10] = {'h','e','l','l','o'};  

//方法二
char str[10];
str[0] = 'h';
str[1] = 'e';

//方法三
strcpy(str, "hello");    //使用strcpy() 函数时,需要添加#include <string.h>头文件

错误二:以下的代码也是极为常见的错误,这里定义了整型指针p,和字符指针str,它们错误的原理一样,就只讨论p。
首先,声明了一个名为p的指针变量,本意是把90存储到p所指的内存位置。但是无法做到,因为我们声明了这个变量,并没有对它进行初始化,所以我们没办法预测90这个值会存储到什么地方。况且,声明一个指向整型的指针并不会“创建”用于存储整型值的内存空间。

int *p;    
*p = 90;     //错误操作

char *str;   
*str = "hello";     //错误操作

我们来分析下面几行代码:

char str1[10] = {'h','e','l','l','o'};  //①
char str2[10] = "hello";                //②

char *str2 = "hello";                   //③

以上代码,都是完全正确的,那么它们有什么区别呢, 首先①和②完全等价,但是③却和它们有不同的含义。尽管它们看起来很像,①和②是初始化一个字符数组元素;而③中的“hello”则是真正的字符串常量,这个指针变量被初始化为指向这个字符串常量的存储位置。正因为③中赋值的是字符串常量,所以一切试图要更改③的内容的操作都是非法的 如:*str = “hi”;(非法)
注意:②和③中的“hello”看上去一样,实际含义完全不同,前者就是一个数组的初始化列表,而后者是一个字符串常量。如何区分字符串常量:当有双引号引起来的字符串,除了在给数组符初值时,其他任何时候都是字符串常量。

整型指针的正确赋值:

int *p;
int num = 90;
p = &num;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值