C语言回忆录3——指针,函数,结构体

学了那么久的指针,你有没有思考过为什么要有指针?指针的优点是什么?

当你定义一个函数如:void fun1(int x);,调用的时候,传递一个值num,fun1(num);这种调用的传值方式叫做值传递

当你定义一个函数如:void fun2(int* x);,调用的时候,传递一个变量num的地址,fun1(&num);这种调用的传值方式叫做引用传递,传的仅仅只是一个num地址。

简单地来说,传递地址,就是引用传递。

区别在于

假如内存的最小单位“位”是一个格子:‘口’

一个字节就是:口口口口 口口口口

值传递,fun1(x);x是一个int类型,假设int类型占用的是4个字节,则函数传递需要传递那么多个格子:

1
2
3
4
口口口口 口口口口
口口口口 口口口口
口口口口 口口口口
口口口口 口口口口

如果传递是结构体的话,就更大了~

引用传递:fun2(&x),传递只是一个地址,假如地址只占用一个字节,如下:

1
口口口口 口口口口

这里,区别就体现出来了,不管是传递什么,引用传递的都是一段地址,而地址只占一个字节。这样计算机处理起来,就快多了!而且没有重复创建副本!

结构体

我曾经以为,结构体的名字应该也和数组的名字一样,是一个地址。
后来才发现,结构体的名字,就是他的值,不是一个地址。这个例子会告诉你。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<stdio.h>
#include<string.h>

int (int argc, char const *argv[])
{

struct Manager
{
char name[50];
int age;
};

struct Manager coco, zero;

//给coco赋值
strcpy(coco.name,"coco");
coco.age=28;

//把coco拷贝给zero
zero=coco;

//测试拷贝是否成功
printf("zero name is %sn",zero.name);
printf("zero age is %dn",zero.age);

//修改zero的名字
strcpy(zero.name,"zero");

//再次查看zero和coco
printf("zero name is %sn",zero.name);
printf("coco name is %sn",coco.name);


return 0;
}