数组名: 代表了这段内存首地址
#includeint main() { int a[3] = { 1,2,3 }; int* p = a; //a-->&a[0] 等效 //no.1 //正常操作: 直接存储数组的首地址 //[]操作等效取*运算 //直接把指针当作数组名就可以了 //优点,这种方式稳妥,不容易出错,一般使用这种方式就够了 for (int i = 0; i < 3; i++) { printf("%d ", p[i]); } printf("n"); //no.2 //用指针做偏移操作 for (int i = 0; i < 3; i++) { printf("%d ", *(p+i)); } printf("n"); //a=a+3; 不能修改 //a+3-->&a[3]; 等效 for (p = a; p < a + 3; p++) { printf("%dt", *p); //*p等效p[0] 取当前地址对应内存中值 } return 0; }
//no.3 //非正常操作:指向其他元素开始操作数组 #includeint main() { int a[3] = { 1,2,3 }; int* p = &a[2];//指针指向第三个数 printf("%dn", *p);//打印指针所指向的数 printf("%dn", p[0]);//打印指针所指向的数 printf("%dn", p[-1]);//打印指针所指向的数的前一个数 printf("%dn", p[1]);//打印指针所指向的数的后一个数,此处由于超出数组长度,没有这个数,所以打印的是-858993460 return 0; }
一级指针操作字符串
#include指针操作二维数组int main() { char str[] = { "iloveyou" }; char* p = str; puts(p); char* pstr = str + 5; puts(pstr); putchar(p[0]); //p[0] 等效*p操作,等效取当前地址下面值 putchar('n'); putchar(pstr[0]);//打印第六个字符 return 0; }
二维数组基础知识
- 数组名:指向数组的指针行地址:数组名[i];
#includeint main() { int array[2][3] = { 1,2,3,4,5,6 }; int* p = &array[0][0]; printf("%pn", array);//打印数组第0行的首地址 printf("%pn", array[0]);//打印数组第0行的首地址 printf("%pn", &array[0][0]);//打印数组的首地址 printf("%pn", array + 1); //打印数组第1行的首地址(即4的地址) printf("%pn", array[1]); //打印数组第1行的首地址(即4的地址) printf("%pn", p + 1); //打印数组第二个元素地址(即2的地址) printf("%pn", array[0] + 1);//打印数组第0行第1个元素的地址(即2的地址) return 0; }
两种方法
- 一级指针操作二维数组 (二维数组在内存连续的)
#includeint main() { int array[2][3] = { 1,2,3,4,5,6 }; int* p = &array[0][0]; for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { printf("%d ", *(p + j + i * 3)); //j+i*3 把坐标转为第几个元素 } printf("n"); } return 0; }
- 数组指针操作二维数组
#includeint main() { int array[2][3] = { 1,2,3,4,5,6 }; int(*p)[3] = NULL; //必须要有括号,和表示的数组列数相同的列数 //先看括号里面是一个指针 //数组指针 即指向数组的指针 //联想整形指针,指向整数 p = array; //这样就可以直接当作数组名去用就行了 for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { printf("%d ", p[i][j]); } printf("n"); } return 0; }
- 数组指针操作二维数组的变形
//看得懂就行,一般不用 //*(p+i)与p[i]即(p+i)[0]之间的转换 #includeint main() { int array[2][3] = { 1,2,3,4,5,6 }; int(*p)[3] = NULL; p = array; for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { printf("%dn", *(*(p + i) + j)); //一维数组:p[i] 等效 *(p+i) printf("%dn", *(p[i] + j)); //取* 等效数组下表运算 *(p+i) (p+i)[0] printf("%dt", *((p + i)[0] + j)); printf("%dt", ((p + i)[0] + j)[0]); printf("%dt", (p[i] + j)[0]); } printf("n"); } }
- 用数组操作多个字符串
#include二级指针int main() { //存储多个字符串--->指针数组 多个指针变量 //整形数组: 多个整形变量 char* pstr[3] = { "Iloveyou","IMiss","IiIIII" }; //每一行上面字符串可以不相同,并且不浪费 //int array[3] array[0] array[1] array[2] //pstr[0] pstr[1] pstr[2]; 分别存储的是每个字符串首地址 for (int i = 0; i < 3; i++) { puts(pstr[i]); } //字符串二维数组也可以存储多个字符串? 列数相同 会导致浪费,多余内存 return 0; }
高一级指针是用来存放低一级指针变量的地址的
#includeint main() { int a = 1; int* p = &a; //一级指针变量存储的是普通变量的地址 int** pp=&p; //二级指针变量存储一级指针变量地址 //*地址 --->得到当前地址对应内存中的值 printf("%dt%dn", *p, p[0]); printf("%dt%dn", **pp, pp[0][0]); int array[2][3] = { 1,2,3,4,5,6 }; //一级指针算偏移 //数组指针做遍历 // warning C4047: “=”:“int **”与“int (*)[3]”的间接级别不同(所有这种提醒当作错误处理) pp = array; for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { printf("%dn", pp[i][j]); } printf("n"); } return 0; }



