C语言学习-翁凯(第九章笔记)
第九章
9.1.1 取地址运算:&运算符取得变量的地址
运算符&
scanf("%d",&i);
里面的&- 获得变量的地址,它的操作必须是变量
int i;printf("%x",&i);
- 地址的大小是否与int相同取决于编译器
int i;printf("%p",&i);
&不能取的地址
- &不能对没有地址的东西取地址
- &(a+b)?
- &(a++)?
- &(++a)?
试试这些&
- 变量的地址
- 相邻变量的地址
- &的结果的sizeof
- 数组的地址
- 数组单元的地址
- 相邻数组单元的地址
(相邻地址之间的差距是4)
9.1.2 指针:指针变量就是记录地址的变量
scanf
- 如果能够将取得的变量的地址传递给一个函数,能否通过这个地址在那个函数内访问这个变量?
scanf("%d",&i);
- scanf()的原型应该是怎样的?我们需要一个参数能保存别的变量的地址,如何表达能够保存地址的变量?
指针
-
就是保存地址的变量
int i;
int* p=&i;
int* p,q;(p是指针,q是int变量)
int *p,q;(p是指针,q是int变量)
(*无论靠近p还是int,都是表示p是指针,如想表达两个指针则:int * p,*q )
指针变量
- 变量的值是内存的地址
- 普通变量的值是实际的值
- 指针变量的值是具有实际值的变量的地址
访问那个地址上的变量*
- *是一个单目运算符,用来访问指针的值所表示的地址上的变量
- 可以做右值也可以做左值
int k=*p;
*p=k+1;
*左值之所以叫左值
- 是因为出现在赋值号左边的不是变量,而是值,是表达式计算的结果:
a[0]=2;
*p=3;
- 是特殊的值,所以叫做左值
指针的运算符&*
- 互相反作用
- *&yptr -> *(&yptr)-> *(yptr的地址)->得到那个地址上的变量->yptr
- &*yptr -> &( *yptr)->&(y)->得到y的地址,也就是yptr->yptr
传入地址
- 为什么
int i;scanf("%d",i);
- 编译没有报错?
9.1.3 指针的使用:指针有什么用呢?
指针应用场景一
- 交换两个变量的值
void swap(int *pa,int *pb)
{
int t=*pa;
*pa=*pb;
*pb=t;
}
指针应用场景二
- 函数返回多个值,某些值就只能通过指针返回
- 传入的参数实际上是需要保存带回的结果的变量
#include<stdio.h>
void minmax(int a[],int len,int *min,int *max);
int main(void)
{
int a[]={
2,3,5,8,64,32,24,12,6,16,26};