#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
// //回顾
// //如果mypoint存放的是变量i的地址值,则称mypoint是指针变量 重点是变量
// //地址就是指针 指针就是地址值
//
// //一.指针变量的定义
// //变量的指针就是变量的地址。我们可以定义一个指向指针的变量(普通变量)的指针变量。
// //这种指针变量 我们在定义的时候 会引入一个* 在定义中,表示这是一个指针变量;
//
// //指针变量的一般形式:
// //类型标识符 *标识符; 标识符:就是指针变量名字
// int i,j;//普通变量
// float k;//普通变量
// //定义指针变量
// int *mypoint1,*mypoint2;//定义两个指针变量 这两个指针变量 指向整型变量的。
// //指针变量定义时,变量名前面有个*,在这个是和普通变量最明显的区别
// float *pm3;//指向实型变量的指针
// float *pm4;//指向实型变量的指针
// //如何让整型指针变量指向一个整型变量 可以用赋值语句使一个整型指针变量指向一个整型变量(普通变量)
// mypoint1 = &i; //&是地址符 等价于mypoint1指向了i; 它本身也有地址值
// mypoint2 = &j; //等价于mypoint2指向了j;
// //什么样的指针变量需要什么样的整型来赋 因为所占的字节数相同
//
// //说明:
// //1大家注意:我"定义"指针变量的时候,指针指针变量前是有*的,表示这是正在定义一个指针变量。
// //但是 我用指针变量的时候 指针变量名前是没有*的,所以指针变量是mypoint1,mypoint2;而不是带*的
// //2一个指针变量只能指向同一个类型的变量(普通变量)
// pm3 = &k;
//
// //二.指针变量的引用
// //牢记:指针变量中只存放地址 不要将一个整型变量赋值给一个指针变量
// //mypoint = 4 在这里就是不行 不可以赋值这个整型变量 他只能存放地址
// //mypoint是个指针变量
//
// //和指针变量相关的
// //(1)&: 取地址运算符 scanf();
// //(2)*:指针运算符(间接访问运算符)
// //a)乘法运算符 3*4;
// //b)指针运算符 定义时指针变量时 我们用到了*;
//
// //但是若这个*不出现在指针变量 定义的场合,而且也不是个乘法运算,那么这个*是啥意思?
// //依旧是指针运算符。
// //只不过代表的是指针变量所指向的变量
//
// int a,b;
// int *p1,*p2; //这里的这个*表示这两个变量是两个指针变量
// a = 100;
// b = 200;
// p1 = &a; //把变量a的地址付给了p1 现在p1指向了a;
// p2 = &b; //把变量b的地址付给了p2 现在p2指向了b;
//
// printf("%d,%d\n",a,b);
// //*指针运算符不用于 定义指针变量的场合时 代表的是他指向的变量
// printf("%d,%d\n",*p1,*p2); //*p1 = a ,*p2 = b;
// //*p1 *p2代表的是原有值,而p1 p2指的是地址值
//
// //--------解析:
// //a)&*p1: &取地址运算符 *指针运算符: 这两个运算符 优先级是相同的
// //但是他们两个运算符是从右到左结合的
// //先看*p1, *p1代表的是p1所指向的变量 其实就是A运算时,其实这个 &*p等价于了&a;
// //又因为&a本身就是p1 所以&*p1等于啥也没干
// //所以:p1 = &*p1; <=> p1 = &a;
// //如果是p2 = &*p1;//等价于指针变量p2指向了a;
// //b)*&a:从右向左看
// //&a = p1 然后:*p = a;
// //c)(*p1) ++; => a++;
// //d)*p++; //++ * 同级 从右到左结合
// //所以 *p++等价于 *(p1++);
// //p1++;的意思是p1指向的是后面的内存:地址值 + 4;
// //老师曾经说过 地址是个数字 地址自加1啥意思
// //如果普通整型变量i,那么i++,如果是4 那么i++变成5
// //同理,指针变量自加一 也肯定是这哥指针变量中的内容要自加
// //但是 本来这种自加1的操作 对于指针来讲
// //就不一定是自加1 自加几取决于该指针变量所指向的变量类型
// //如果p指向的是整型变量 那么p++的内容要加4 因为本身p是int类型
// //因为int是4个字节
// //p1++意味着p1多指向i之后的变量
// //要完整跳过四个字节 所以p++后内存内容如下:
// //*(p1++)不再指向A了 他就指向A后面的内存去了
// //所以*p++这个动作相当危险
//范例:
int *pmax,*pmin,*p,a,b; //pmax指向大的值 pmin指向小的值
a = 5;
b = 8;
pmax = &a;
pmin = &b;
if(a<b){
//为了演示指针变量的赋值 老师写的啰嗦一点
p = pmax;//p指向a
pmax = pmin; //把p地址当做中间变量
pmin = p;
}
printf("max = %d,min = %d\n",*pmax,*pmin);
//变量a,b的值并没有变 只是改变了pmaxpmin指针的的指向
}
C语言第九章指针
最新推荐文章于 2021-03-18 15:10:36 发布