首页 > 投稿 > 正文内容

C语言赋值操作入门:变量、指针、数组的3种基础写法

投稿2025-05-19 16:01:34

哎,刚学C语言的时候,你是不是也被这个等号搞懵过?明明在数学里等号就是两边相等,怎么到代码里就完全不是一回事了?新手如何快速涨粉可能还早,但新手如何不被赋值操作劝退才是当务之急。今天咱们就掰开了揉碎了说说这个看着简单、实际藏着坑的赋值操作。

先来举个真实案例吧。上周有个学员问我:"老师,我写了个int a = 5;后面又写a == 10;怎么程序没反应啊?"你看,这就是典型的把赋值和比较搞混了。??C语言里的等号有两大功能:初始化和赋值??。初始化是第一次给变量安家,赋值是后面改装修。那这两个到底有什么区别呢?

??变量赋值的基础姿势??
先说最常见的变量赋值。比如:
int age; //声明
age = 18; //这才是正经赋值
这时候要注意三点:

  1. 左边必须是变量名,不能是常量或者表达式
  2. 右边可以是具体数值,也可以是其他变量
  3. 类型要匹配,别拿char给int赋值(除非你知道自己在做强制转换)

举个作死的例子:
float pi = 3.14;
int num = pi; //这里会自动丢掉小数部分
你可能想问:"那这样会不会报错啊?"其实不会,但会警告,这就是隐式转换的坑。

??指针赋值的骚操作??
到指针这里就刺激了。很多人第一次见星号就头晕,其实记住这个口诀:"声明带星号,赋值要地址"。比如说:
int value = 100;
int *p; //声明指针
p = &value //正确赋值
这时候最容易犯的错就是直接写p = 100;,这就相当于把门牌号当房子用了。

对比下正确和错误写法:

正确写法错误写法后果
p = &valuep = value;段错误等着你
*p = 200;p = 200;内存乱写可能崩溃
这个表格是不是比纯文字清楚多了?反正我当年要是有人给我这么列出来,能少熬三个通宵。

??数组赋值的特殊姿势??
数组赋值更是个奇葩。其他语言可能允许直接arr1 = arr2,C语言偏不。这时候新手常问:"为什么我的数组赋值总是报错?"答案很简单——??数组名本质上是个地址常量??,不能当左值用。

正确的打开方式有两种:
第一种逐个元素赋值:
int src[5] = {1,2,3,4,5};
int dest[5];
for(int i=0; i<5; i++){
dest[i] = src[i];
}
第二种用memcpy函数:
#include
memcpy(dest, src, sizeof(src));
不过要注意,字符串数组还是建议用strcpy,毕竟遇到'\0'会自己停。

说到这,可能有人要问:"那结构体赋值呢?"哎,结构体倒是可以直接用等号赋值,这个算是C语言给的一点小福利吧。不过结构体里如果有指针成员,那又是另一个坑了,咱们下次再说。

??自问自答环节??
Q:为什么我给指针赋值后程序崩溃?
A:八成是没分配内存就操作。比如:
char *str;
strcpy(str, "hello"); //boom!
应该先malloc或者指向现有内存

Q:数组初始化能用变量吗?
A:C99之前绝对不行,现在可以用变长数组但要注意编译器支持

Q:指针赋值和变量赋值最大的区别?
A:指针装的是地址,变量装的是实际值。改指针指向不影响原变量,改指针指向的内容才会影响

小编观点:说实在的,赋值操作看着简单,但里面门道真不少。新手最容易栽在指针和数组上,建议先把变量赋值玩熟了,再碰指针。记住,写代码时多问自己:"这个等号到底在干什么?"搞明白数据流向,就能避开大半的坑。别总想着搞什么骚操作,把基础打牢才是王道。

搜索