#include<stdio.h>
#include<stdlib.h>
int main(void)
{
//我的电脑内存是8个G所以,就是有80个G的字节
//变量a,b,b,这些变量都是保存在哪里? 在内存里
//内存中的每一个字节都有地址,也就是说80亿个字节就有80亿个地址
//而地址是从零开始编号的,即:第一个字节就是0
//即 地址就是这样编号的:0,1,2,3,4 ...... 80亿
//你可以想象在内存中已经给每个字节编好号了,一个接着一个......,而这就是所谓的地址
//每一次执行变量的地址都会在内存中重新分配,所以在黑窗口中的地址可能会不一样
int a;//那么a变量有4个字节,那么按理说就有4个地址
int b;
float c;
//这个*是指针,在这里我们定义了一个变量d,而*说明它是一个指针,而它指向的是一个int类型
int *d;
//一个指针占用4个字节,但是也分指向的数据类型,比如double就是8个字节
float *e;//e是一个指针
char c1,c2,c3,c4,c5;
int *k;//没有初始化,即指针k里面没有一个有效的数字,我们就去操作的话
//如果这个k等于这个b的话
k = &b;
//当我们使用完了这个指针后,我们可以让他指向另外一个变量
k = &a;
d = NULL;//指向d就没有指向任何地址
/*注意在使用指针的时候一定要注意指针的状态*/
/*如果没有初始化,那么很明显不能使用*/
/*但是如果我们把指针让它指向一个有效的地址
那么就可以使用了,而且使用的时候可以随意的
更改,当我们我不想让这个指针指向指向任何
一个地址的时候,我们就使它为null,而null实际上就是0
但是最好写成NULL,这样更加醒目,
而且在计算机中0这个地址是不会给我们使用的,
0的地址所以说非常特殊,我们用的一般是100万
之后的地址,100万前一般是操作系统占据的 */
*k = 66;//这里就是修改b的值
/*如果是这样写的话
int *k;//没有初始化
这个k没有指向一个有效的变量
k = 99;//这样做是不允许的,它不会改掉任何一个字节
所以上面这个操作是一个无效的操作
所以指针一定需要初始化,让指针里面要有一个有效的地址,这样后才能使用指针
*/
c1 = 'a';//一个字符就是一个字节
c2 = 'b';
c3 = 'c';
c4 = 'd';
c5 = 'e';
a = 112;
d = &a;//这里是把a的地址编号赋值给d
e = &c;
b = -1;
c = 3.14;
/*把debug换成Release才能准确地看到指针,地址,因为调试状态下,地址是不准确的*/
//而这个*是间接访问,也叫做解引用指针
printf("a = %d\n",*d);//通过指针d,间接地访问a
//通过指针间接操作
*d = 88;//这里修改的变量a,原来是112,现在88;
printf("a的地址:%d\n",&a);
printf("d的地址:%d\n",d);
printf("%d\n",a);
//打印变量a的地址,&这个标志表示取某个变量的地址
//首先变量a占用了4个字节,那我们通常把这4个字节的首字节的地址作为变量a的地址
printf("%d\n",&a);//1703740
printf("%d\n",b);
//打印变量b的地址
printf("%d\n",&b);//1703736 它和a的地址刚好相差4个字节
printf("%f\n",c);
//打印变量C的地址
printf("%d\n",&c);
//查看刚刚定义的五个字符的地址
printf("%d\n",&c1);
printf("%d\n",&c2);
printf("%d\n",&c3);
printf("%d\n",&c4);
printf("%d\n",&c5);
printf("yes\n");//printf这个函数是在<stdio.h>这个头文件里面
/*由于如果没有system这个函数的话,那么这个黑窗口就会闪一下就退出了*/
system("pause");//system()这个函数是在<stdlib.h>这个头文件里面
return 0;
}