3.3日C语言笔记
/***************** 指针开始 *****************/
1.运算符&。
* scanf("%d",&i);里面的&—>获得变量的地址,它的操作数必须是变量。
* int i;printf("%x",&i);—>地址的大小与否与int相同取决于编译器。
int i;printf("%p",&i);地址和整数并不是永远相同的,这取决于你的架构。
2.指针(point)。 p是地址,&是取地址,是取值本质:保存地址的变量。 int i; int p=&i; int* p,q; //星p是一个int型指针,q是一个int型变量// int p,q; //星p是一个int型指针,q是一个int型变量//※变量的值是内存的地址;普通变量的值是实际的值;指针变量的值是具有实际值的变量的地址!!!即:–>&–>i代码:
int main(){ int i=6; printf("&i=%p\n",&i); f(&i); g(i); return 0;}void f(int *p){ printf(" p=%p\n",p); printf("*p=%d\n",*p); p=26; ///因为传入的p是i的地址,所以可以通过修改指针里面的内容来直接改动i变量的值,这也体现了指针是存放变量地址的意义}void g(int i){ printf(“k=%d”,i);}
3.左值之所以叫左值,是因为出现在赋值号左边的不是变量,而是值,是表达式计算的结果。
4.传入地址。 为什么 —:int; scanf("%d",i);编译没有报错?因为刚好是32wei架构的,整数和地址是一样大的,对于scanf是一样大的,以为你传入的是地址,实际上是值。
5.交换变量的值
#include <stdio.h>void swap(int *i,int *j);int main(){ int a=5; int b=6; swap(&a,&b); printf(“a=%d,b=%d”,a,b); return 0;}void swap(int *i,int *j){ int t; t=*i; *i=*j; *j=t;}
6.指针的用处二:函数返回运算的状态,结果通过指针返回;常用的套路是让函数返回不属于有效范围内的值来表示出错;-1/0(在文件操作中会看到大量的例子);但是当任何数值都是有效的可能结果时,就得分开返回了;后续的语言(C++/Java)采用了异常机制来解决这个问题。
7.指针最常见的错误。定义了指针,但是还没有让它指向任何变量就开始使用指针。