c语言指针到底有什么作用,【C语言】指针到底有什么用?

很多初学者(包括我),学习指针的时候总有这样一个疑问:指针到底有什么用?只是多了一种访问变量的方法而已,有这么重要么?

举个例子:通过函数交换两个整型变量的值

初学者一般都会这么写

#include

void Swap(int a, int b) {

int temp = a;

a = b;

b = temp;

}

int main(void) {

int a=1, b=2;

Swap(a, b);

printf("%d, %d

", a, b);

return 0;

}

输出结果

1, 2

交换失败。

为啥呢?

不知道的同学可以补习一下变量的作用域相关知识。

使用指针交换

#include

void Swap(int* pa, int* pb) {

int temp = *pa;

*pa = *pb;

*pb = temp;

}

int main(void) {

int a=1, b=2;

Swap(&a, &b);

printf("%d, %d

", a, b);

return 0;

}

输出结果

2, 1

交换成功。

为啥呢?

因为 Swap() 函数传入的是两个指针,有了指针,就可以冲出 Swap() 函数,拿着指针找变量了。

再举个例子: scanf() 函数

为啥 scanf() 函数传入的是指针而不是变量本身呢?

我们模拟一下

#include

void Scanf(int a) {

a = 1; //假设获取到了1

}

int main(void) {

int a;

Scanf(a);

printf("%d

", a);

return 0;

}

输出结果(不同的编译器下可能不同)

4198575

没有成功赋值。

使用指针赋值

#include

void Scanf(int* pa) {

*pa = 1; //假设获取到了1

}

int main(void) {

int a;

Scanf(&a);

printf("%d

", a);

return 0;

}

输出结果

1

成功赋值。

所以,指针是连接主调函数和被调函数的桥梁。

再举个例子:将结构体作为函数参数

有如下代码

#include

typedef struct Student {

char *name;

int age;

int score;

} Student;

void say(Student stu) {

printf("我是%s,年龄%d岁,成绩是%d

", stu.name, stu.age, stu.score);

}

int main(void) {

Student stu;

stu.name = "小明";

stu.age = 10;

stu.score = 90;

printf("sizeof(stu)=%d

", sizeof(stu));

say(stu);

return 0;

}

输出结果

sizeof(stu)=12

我是小明,年龄是10,成绩是90

stu 结构体变量占用了12个字节,在调用函数时,需要原封不动地将12个字节传递给形参。如果结构体成员很多,传送的时间和空间开销就会很大,影响运行效率。

那怎么样才能减少时间和空间开销呢?

使用结构体指针

#include

typedef struct Student {

char *name;

int age;

int score;

} Student;

void say(Student *stu) {

printf("我是%s,年龄%d岁,成绩是%d

", stu->name, stu->age, stu->score);

}

int main(void) {

Student stu;

stu.name = "小明";

stu.age = 10;

stu.score = 90;

printf("sizeof(stu)=%d, sizeof(pstu)=%d

", sizeof(stu), sizeof(&stu));

say(&stu);

return 0;

}

输出结果

sizeof(stu)=12, sizeof(pstu)=4

我是小明,年龄10岁,成绩是90

可见,使用结构体指针的空间开销比直接使用结构体变量要小。

所以,使用指针可以使时间和空间开销更小。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值