//C语言第八讲,指针
// 数据的访问方式直接访问(直接访问内存单元中的内容)和间接访问(通过内存单元编号以及数据所占字节数,访问内存中的数据)
//直接访问
// int a=20;//(一个字节占八位)
// 字节和位
// 字节是最小的存储单元,一个字节被称为一个存储单元(内存单元),不同的数据类型所占的存储单元也不同
// 一个字节占八位
//基本数据类型
/*char 一个字节 一个内存单元
short 两个字节 两个内存单元
int 四个字节 四个内存单元
long四或八个字节 四或八个内存单元
float四字节 四个内存单元
double八字节 八个内存单元*/
// 为了正确访问内存单元,每个内存都有一个编号。内存单元的编号称作地址。
// 内存地址==地址==内存单元编号
// 内存单元中的 内容才是我们关注的 数据
// 指针就是内存地址。我们习惯上把内存地址叫做指针(内存地址简称为地址)
// & 取址符可以查看一个内存变量的内存地址(内存首地址)
// 格式化输出内存地址用%p
// int a=6666;
// printf("&a(a的内存地址) = %p\n",&a);
//
// int b=45,c;
// printf("&b(b的内存地址) = %p\n",&b);
// printf("&c(c的内存地址) = %p\n",&c);
// double d=3.1415926;
// printf("&d(d的内存地址) = %p\n",&d);
// char r='k';
// printf("&r(r的内存地址) = %p\n",&r);
// char s='s';
// printf("&s(s的内存地址) = %p\n",&s);
// &取的只是首地址,并不是a只占这一个内存地址,变量a的数据类型决定a占几个内存地址
// 指针变量:存放内存地址的变量;
// 基本数据类型 * 变量名 =内存地址;
// int *q= NULL;//恒等于0;
// printf("q=%p\n",q);
//取值操作符:*。我们通过*来访问内存单元中存储的数据。(*取值,&取址)
// int a=110;
// printf("a=%p\n",&a);
// int *p =&a;
// printf("p=%p\n",p);
// printf("a=%d\n",*p);
// printf("a=%d\n",a);
// float b=3.1415;
// printf("b=%p\n",&b);
// float *p =&b;
// printf("p=%p\n",&b);
// printf("b=%f\n",b);
// printf("b=%f\n",*p);
// char c='k';
// printf("c=%p\n",&c);
// char *p=&c;
// printf("p=%p\n",p);
// printf("c=%c\n",*p);
// printf("c=%c\n",c);
// double d=0.618;
// printf("d=%p\n",&d);
// double *p=&d;
// printf("p=%p\n",p);
// printf("d=%f\n",d);
// printf("d=%f\n",*p);
//
// long e=140;
// printf("e=%p\n",&e);
// long *k=&e;
// printf("k=%p\n",k);
// printf("e=%ld\n",e);
// printf("k=%ld\n",*k);
//
//指针的重指向,
//指针变量的赋值意味着重新指向,而不是同时指向多个地址
// int a=3,b=5;
// printf("a=%p\n",&a);
// printf("b=%p\n",&b);
// int *p=&a;
// p=&b;
// printf("p=%d\n",*p);
// printf("p=%p\n",p);
// int *p;(整形指针)
// double *q;(双精度)
// char *g;()
// 指针变量所占字节数 只与 操作系统有关(32位操作系统下占4字节,64位操作系统下占8字节)
//
// int a=20;
// int *p=&a;
// printf("SizeA = %lu\n",sizeof(a));
// printf("SizeP = %lu\n",sizeof(p));
// 特别注意
// int *j = &a;//如果出现*的地方,前边有任何类型修饰符,比如(int char等),此时*仅仅起到表示作用,告诉编译器这是一个指针变量(取地址)
// *j=337; // 如果出现*的地方,前边没有任何类型修饰符,此时*代表取值操作符,他会把指针指向的区域中的内存取出来(取值)
// j;// 如果前边没有*和类型修饰符,那么这个变量就是一个指针变量,它里边存储着某一个内存地址
// 指针赋值
// C语言允许使用赋值运算符对指针进行赋值;
// int i,j,*p,*q;
// p=&i;
// q=&j;
// i=1;
// *q=*p;//如果*p=*q,则输出结果位0;
// printf("j=%d\n",j);
// printf("p=%p\n",p);
// printf("q=%p\n",q);
// printf("*p=%d\n",*p);
// printf("*q=%d\n",*q);
// 练习定义一个函数,并且在内部修改外部变量的值;
int value=99;
printf("&value=%p\n",&value);
printf("value=%d\n",value);
changeValue(value);
printf("value=%d\n",value);
/*前面的定义
//函数声明
void changeValue(int value);
//函数定义
void changeValue(int value){
value = 998;
printf("value=%d\n",value);
}