C语言 指针部分小结

@Chita_

C语言 指针部分小结

  1. 传递函数参数
  2. 提高效率
  3. 设置限制
  4. 函数返回指针

传递函数参数

a, b 为形式参数

int add(int a, int b)
{
	return a + b;
}

i, j 为实际参数

int i = 1, j = 2;
int k = add(i, j);

a, b的改变不会引起i, j的改变

void swap(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
}
int i = 5;
int j = 10;
swap(i, j);
printf("%d %d", i, j);

输出

5 10

swap()之后,i, j的值没有变化

那么,如何通过swap()改变i, j的值呢?

1.将地址的副本传递给函数
2.正式参数和实际参数都指向相同的地址
3.可以使用指针作为函数参数来完成

void swap(int *a, int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}
int i = 5;
int j = 10;
swap(&i, &j);
printf("%d %d", i, j);

输出

10 5

提高效率

• 调用:将结构变量作为输入参数传递给函数时,其所有组件值都将复制到局部结构变量中
• 传递结构的整个副本可能效率低下,尤其是对于大型结构
• 为了提高效率,请将结构地址的副本传递给功能
• 可以使用指向struct的指针作为函数参数来完成

typedefstruct student_info
{
	char name[40];
	int student_id;
	int age;
} StudentInfo;

void print_student(StudentInfo s)
{
	printf("Name: %s\n", s.name);
	printf("Student ID: %d\n", s.id);
	printf("Age: %d\n", s.age);
}
...
StudentInfo s1 = {"John", 12345, 20};
print_student(s1);

传递了s1地址的副本,而不是整个结构s1的副本

typedef struct student_info
{
	char name[40];
	int student_id;
	int age;
} StudentInfo;

void print_student(StudentInfo *s)
{
	printf("Name: %s\n", s -> name);
	printf("Student ID: %d\n", s -> id);
	printf("Age: %d\n", s -> age);
}
...
StudentInfo s1 = {"John", 12345, 20};
print_student(&s1);

设置限制

...

void print_student(StudentInfo *s)
{
	printf("Name: %s\n", s -> name);
	printf("Student ID: %d\n", s -> id);
	printf("Age: %d\n", s -> age);
	
	s->age = 1000;
}

...

•print_student()可以实际修改s的值
•如何限制函数修改通过引用传递的参数?
•将const修饰符添加到参数

...

void print_student(const StudentInfo *s)
{
	printf("Name: %s\n", s -> name);
	printf("Student ID: %d\n", s -> id);
	printf("Age: %d\n", s -> age);
	
	s->age = 1000; //编译不通过 
}

...

函数返回指针

函数可以返回一个指针
确保返回的指针指向有效的内存位置

float *find_max(float A[], int N)
{
	int i;
	float *the_max = &(A[0]);
	for(i = 1; i < N; i++)
		if (A[i] > *the_max) the_max = &(A[i]);
	return the_max;
}

int main(void)
{
	float scores[5] = {10.0, 8.0, 5.5, 2.0, 4.1};
	float *max_score;
	
	max_score = find_max(score, 5);
	printf("%.1f\n", *max_score);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值