#include <stdio.h> #include <stdlib.h> //指针就是内存地址 //32为操作系统最大是4G内存,32为系统则是2的32次方, //所以只能表示2的32次方个内存地址, 也就是2的32次方个字节就是4G. main(){ int i;//i是内存空间的别名 ,i里面保存的是内存地址, i = 3; printf("%#x ", &i); system("pause"); }
#include <stdio.h> #include <stdlib.h> main(){ //野指针:没有赋值的指针 int* p; int i; double d = 3.14; p = &d; //不是野指针了, //*p = 23; printf("%#x ", p);//打印地址,p里面存的是地址 printf("%lf ", *p); system("pause"); } /*##*的三种用法 1. 乘法 2. int* p:定义一个指针变量p,p中存放一个内存地址,这个地址所存放的数据规定是int型 3. *p:取出p中保存的内存地址存放的数据 ##数据传递 * 所有语言所有平台,都只有值传递,引用传递传递的值是内存地址 */ #include <stdio.h> #include <stdlib.h> void swap(int* p, int* q){ int temp = *p; *p = *q; *q = temp; } main(){ int i = 3; int j = 5; printf("i=%d ", i); printf("j=%d ", j); swap(&i, &j); printf("i=%d ", i); printf("j=%d ", j); system("pause"); }
#include <stdio.h> #include <stdlib.h> void function(int* p, int* q){ *p += 15; *q += 15; } main(){ int i = 10; int j = 20; function(&i, &j); printf("%d ", i); printf("%d ", j); system("pause"); } #include <stdio.h> #include <stdlib.h> void function(int** p){ int i = 3; printf("i的地址为%#x ", &i);
//p就是取出p内存空间的值 //*p:就是取出p内存空间值的内存空间的值, *p = &i;//修改P所指向的内存空间值的内存空间的值 } main(){ int* mainp;//mainp在栈中存的是地址,指向堆中的一个int数据 的内存空间 。 function(&mainp);//&mainp在栈中存的是地址的地址也就是 mainp的地址,也就是指向mainp的内存空间。 printf("主函数中获取i的地址为%#x ", mainp); //数据幻影 printf("主函数中获取i的值为%d ", *mainp);//-2因为i是局部变量已经销毁了 system("pause"); }
内存分析:0级指针,一级指针,二级指针都有, 二级指针是曾曾用名,一级指针是曾用名。
#include <stdio.h> #include <stdlib.h> main(){ //char arr[] = "hello"; int arr[5] = {1,2,3,4,5}; printf("%#x ", &arr[0]);//0x22ff50 printf("%#x ", &arr[1]); printf("%#x ", &arr[2]); printf("%#x ", &arr[3]); //arr = printf("数组名字的地址%#x ", &arr);//也是输出第0个元素的地址 printf("数组名字的地址%#x ", arr);//也是输出第0个元素的地址 //char* p = &arr; int* p = &arr; //+1表示向右偏移一个单位 printf("%d ", *(p+0));// 1 printf("%d ", *(p+1));//2 printf("%d ", *(p+2));//3 printf("%d ", (p+2)-p); //2 system("pause"); }
#include <stdio.h> #include <stdlib.h> main(){ char* cp; int* ip; short* lizhip; int i; char c; cp = &c; ip = &i; //指针的长度都是4个字节 printf("%d ", sizeof(cp));//4 printf("%d ", sizeof(ip));//4 printf("%d ", sizeof(lizhip));//4 printf("%d ", (p+2)-p); //2,偏移量。 printf("%d ", cp-ip);//出错, 连续内存空间相加减是可以的,非连续的内存空间相加减是没有意义的, system("pause"); }