今日学习内容:
笔记:
1.指针的使用
- 交换两个变量的值
#include <stdio.h>
void swap(int* pa, int* pb);
int main(void)
{
int a = 5;
int b = 6;
swap(&a, &b);
printf("a=%d,b=%d\n", a, b);
return 0;
}
void swap(int* pa, int* pb)
{
int t = *pa;
*pa = *pb;
*pb = t;
}
- 函数返回多个值,某些值只能通过指针返回程序
- 传入的参数实际上需要保存带回结果的变量
#include <stdio.h>
void minmax(int a[], int len, int* max, int* min);
int main()
{
int a[] = { 1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55 };
int min, max;
minmax(a, sizeof(a) / sizeof(a[0]), &min, &max);
printf("min=%d,max=%d.\n", min, max);
return 0;
}
void minmax(int a[], int len, int* min, int* max) //作用是把结果带出来
{
int i;
*min = *max = a[0];
for (i = 1; i < len; i++)
{
if (a[i] < *min)
{
*min = a[i];
}
if (a[i] > *max)
{
*max = a[i];
}
}
}
len是长度,其=sizeof(a)/sizeof(a[0]),a数组的全部字节长度除以a数组每个单元的字节长度,就是a数组的长度了。
return只能返回一个值,你可以理解为一个有返回值的函数只能表示一个值。为了返回多个,比如两个值,我们就要用指针这个变态,进去假装变量,然后窃取函数的劳动成果
- 函数返回的状态,结果通过指针返回
- 常用的套路:让函数返回的特殊的不属于有效范围的值来表示出错:用-1/0返回表示没成功(但当任何数值都是有效的可能结果时,就要分开返回) 则此时状态用函数的return来返回 而实际值通过指针参数返回。
#include <stdio.h>
int divide(int a, int b, int* result);
int main(void)
{
int a = 5;
int b = 2;
int c;
if (divide(a, b, &c))
{
printf("%d/%d=%d.\n", a, b, c);
}
return 0;
}
int divide(int a, int b, int* result)
{
int ret = 1;
if (b == 0)
{
ret = 0;
}
else
{
*result = a / b;
}
return ret;
}
//运算可能会出错,所以要通过另外途径表达出来
最常见错误:定义了指针变量,还没让它指向任何变量就开始使用(没有和任何变量联系在一起,没被赋予一个实际的值)
是在声明指针变量的时候就要对指针变量赋值,如果只声明不赋值,指针变量将会是一个未定义的值(可以理解为垃圾值)。
2.指针与数组:
传入函数的变量:普通变量→参数接收到的是值;传指针→接收到的也是值(是地址)
数组作为值传给函数
函数参数表中的数组实际上是指针【sizeof(a)==sizeof(int*)】 但可用数组的运算符[ ]计算
- 数组参数
数组变量:特殊指针 本身表达地址(不用加&) 【但数组单元表达的是变量,要用&】
a==&a[0]
[]可对数组做也可对指针做【p[0] <= => a[0]】 p是int *类型的指针用于存放地址。p = &min *p取的是地址里面的值
*运算符可以对指针做也可以对数组做【a = 25】
数组变量是const的指针,so不能被赋值 inta[] <==> intconst a =…
3.指针与const
const在*左边不是表示数值不能改变,而是表示不能通过指针改变数值,直接赋值是可以改变的。
常量指针:常量不可以变,指针指向可以变(如不能通过指针p去修改变量i )