指针和数组(二)
#include <stdio.h>
int main ()
{
int a[2][3] = {1,2,3,4,5,6};//int* p3 = a; // 当前虽能正常运行,但是不能这样使用,毕竟类型级别不相同int* p1 = a[0]; // a[0] == *(a+0) 第0行的首地址int* p2 = a[1]; // a[1] == *(a+1) 第1行的首地址int i, j;for (i = 0; i < 2; i++) // 行{for (j = 0; j < 3; j++) // 列{//printf("%d ", a[i][j]);//printf("%d ", p3[j]);}printf("\n");}
return 0;
}
展示结果:
代码:
#include <stdio.h>
int main()
{int a[2][3] = { 1,2,3,4,5,6 };int* p1 = a[0];int* p2 = a[1];int** ptr = &p1;*(ptr + 1) = p2;int i, j;for (i = 0; i < 2; i++) // 行{for (j = 0; j < 3; j++) // 列{printf("%d ", ptr[i][j]);}printf("\n");}return 0;
}
效果展示:
// 典型应用场景:
// 1、操作多个字符串时
// 2、管理多个堆内存时
// 字符串数组,实际就是一个指针数组
char* str[] = {"1234567", "4567890", "7890123"};
#include <stdio.h>
int main()
{
// arr也是指针数组int a[] = {1, 2, 3};int b[] = {4, 5, 6};int c[] = {7, 8, 9};int* arr[] = {a, b, c};int** ptr = str; // 这种方式不合理//int** ptr = arr; // 虽能输出数据,但也不合理int i, j;for (i = 0; i < 3; i++) // 行{for (j = 0; j < 3; j++) // 列{printf("%c", ptr[i][j]);}printf("\n");}
return 0;
}
效果展示:
数组指针应用案例:
#include <stdio.h>
int main()
{int (*ptr)[3] = a; // ptr指向的是行首地址printf("&a = %p\n", &a); // 整个二维数组的起始地址printf("&a+1 = %p\n\n", &a+1); // 整个二维数组的起始地址,偏移整个数组24字节printf("a = %p\n", a); // 数组的起始地址printf("a+1 = %p\n\n", a+1); // 数组的起始地址,偏移一行12字节printf("a[0] = %p\n", a[0]); // 第0行的起始地址printf("a[0]+1 = %p\n\n", a[0]+1); // 第0行的起始地址,偏移一个元素4字节printf("ptr = %p\n", ptr); // ptr指向了行首地址printf("ptr+1 = %p\n\n", ptr+1); // ptr+1 == a+1, 偏移一行12字节//int i, j;//for (i = 0; i < 2; i++) // 行//{// for (j = 0; j < 3; j++) // 列// {// //printf("%d ", a[i][j]);// printf("%d ", ptr[i][j]);// }// printf("\n");//}
return 0;
}
// a即代表数组首地址,也代表第0行的首地址,同时也是第一个元素的首地址
int a[2][3] = {1, 2, 3, 4, 5, 6};
// 典型应用场景
// 1、二维数组在进行函数传参时,行参需要使用数组指针
// 2、在操作矩阵数据时,使用数组指针