@Chita_
C语言 指针部分小结
- 传递函数参数
- 提高效率
- 设置限制
- 函数返回指针
传递函数参数
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;
}