// // main.c // day09 #include <stdio.h> int main(int argc, const char * argv[]) { int num = 10; int *numP = # num = 55; *numP = 100; // num == *numP printf("%i ", num);//100 printf("%i ", *numP);//100 int ages[3] = {1, 3 , 5}; // 数组名保存的是数组的地址, 数组的地址就是首元素的地址 printf("ages = %p ", ages);//0xff4c printf("&ages[0] = %p ", &ages[0]);//0xff4c // 指针是专门用于保存地址 // 数据类型 *变量名称; // 由于数组的首元素的地址就是数组的地址, 所以定义一个指针指向数组其实就是定义一个指针指向数组的首元素, 所以数组的首元素是什么类型, 那么指向数组的指针就是什么类型 int *p = &ages[0]; int *p = ages;// 数组名也是地址类型int*,数组的首元素是什么类型那么数组指针p就是什么类型 printf("p = %p ", p);//0xff4c printf("&ages[0] = %p ", &ages[0]);//0xff4c // 如何利用指针操作数组 int ages[3] = {1, 3 , 5}; ages[0] = 998; printf("ages[0] = %i ", ages[0]); int *p = ages; // int *p = &ages[0]; &ages[0] == ages printf("p = %p ", p);////0xff4c printf("ages = %p ", ages); //0xff4c, p == ages; // 以为p指针中存储的值和ages中存储的值相同, 所以以前用ages的地方都可以使用p来替代 p[0] = 889; printf("ages[0] = %i ", p[0]);//889 for (int i = 0; i < 3; i++) { printf("p%i] = %i ", i, p[i]);//889,3,5,二位数字好像不行 } int ages2[2][3] = {{1, 3 , 5},{2,4,6}}; int *p2 = ages2; for(int i=1;i<=6;i++){ printf("%i", p2++);//1,3,5,2,4,6,一维数组二维数组存储空间是连续的。 } int ages[3] = {1, 3 , 5}; //ages占用12个字节, int *p; p = ages; // int *p = &ages[0]; printf("ages[0] = %i ", ages[0]);//1 printf("*p = %i ", *p);//1 printf("p = %p ", p);//0xff4c // p = &ages[1]; // 指针+1, 并不是真实的+1, 而是+4不是+8, // 指针类型的两个用途: 第一个用途, 取值的时候, 会根据指针类型所占用的字节去取出对应字节的数据 第二个用途, 用于做加法运算, 指针+1, 其实是加上指针类型所占用的长度 , 如果当前指针类型是int, 那么+1本质上是加上4个字节 p = p + 1; printf("p + 1 = %p ", p);//0xff50 printf("*p = %i ", *p);//3 // p = &ages[2]; p = p + 1; printf("p + 1 = %p ", p);//0xff54 printf("*p = %i ", *p);//5 int a = 10; a = a + 1; printf("a = %i ", a); // 11 int num = 10; //num占用4个字节 int *numP = # //numP占用8个字节 printf("num = %i ", num); //10 // *numP 代表访问numP指向的那块内存空间 printf("*numP = %i ", *numP); //10 char c = 'a'; char *cp = &c; printf("cp = %p ", cp);//0xffab cp = cp + 1; printf("cp + 1 = %p ", cp);//0xffac cp = cp + 1; printf("cp + 1 = %p ", cp);//0xffad,字符只占用一个字节 int ages[3] = {1, 3 , 5}; int *p; p = ages; printf("ages[0] = %i ", *(p + 0)); //1 printf("ages[1] = %i ", *(p + 1)); //3, p = p + 1; *p; printf("ages[2] = %i ", *(p + 2)); //5 for (int i = 0; i < 3; i++) { // 指针+1, 是加上指针类型所占用的长度 printf("ages[%i] = %i ", i, *(p + i)); //1,3,5 } /* 只要一个指针指向了数组, 那么访问数组就有3种方式: 1. : ages[0]; 2. : p[0]; 3. : *(p + 0); */ printf("ages[0] = %i ", 2[p]);//5 return 0; }