美文网首页从汇编到C++
C语言21 指针数组与数组指针

C语言21 指针数组与数组指针

作者: Asura_Luo | 来源:发表于2018-05-04 02:49 被阅读0次

C语言21 指针数组与数组指针

指针数组的定义

char arr[10]; //10 char
char* arr[10]; //10 指针(char*)
Point* arr[10]; //10 指针(Point*)
int******** arr[10]; 

指针数组的赋值

char* a = "Hello";
char* b = "World";

//方式1:
char* arr[2]= {a,b};

//方式2:
char* arr[2];
arr[0]=a;
arr[1]=b;

结构体指针数组

struct Point
{
    int x;
    int y;
}
Point p;            //8字节 一个结构体
Point arr[10];      //8字节 * 10 结构体数组
Point* arrPoint[10];  //4字节 * 10 结构体指针数组

分析下面的代码

int arr[] = {1,2,3,4,5,6,7,8,9,0};
int* p =&arr[0]; //数组首个元素地址
int* p = arr;    //数组首个元素地址 跟上面的表达方式是一样的 也可以说是简写形式
int* p =&arr;    //什么情况? --编译失败 (int(*)[10] 类型 不可以转换为 int* 类型)

//我们使用显式声明类型来躲避编译器检查

int* x = (int*)&arr;

//我们编译后发现 此时的x 值和上面的p值是一样的

//那么区别是什么呢
//当我们使用&arr 获得的类型就是 int(*)[10] 类型 也就是数组指针类型

数组指针的定义

//定义数组指针的写法

int(*px)[5];//一维数组指针  px 这里就是当前指针的名字
char(*px)[3];  //px 就是指针的名字

int(*px)[2][2]; //二维数组指针  px 就是指针的名字

char(*px)[3][3][3]; //三维数组指针  px 就是指针的名字

//思考:
//int *p[5] 与 int(*p)[5] 有什么区别?

数组指针的宽度与赋值

int(*px1)p[5];      //一维数组指针
char(*px2)[3];      
int(*px3)[2][2];        //二维数组指针
char(*px4)[3][3][3];    //三维数组指针

printf("%d %d %d %d\n",sizeof(px1),sizeof(px2),sizeof(px3),sizeof(px4));
// 4 4 4 4 
px1 = (int (*)[5])1;
px2 = (char (*)[3])2;
px3 = (int (*)[2][2])3;
px4 = (char (*)[3][3][3])4;

数组指针的运算

int(*px1)p[5];      //一维数组指针
char(*px2)[3];      
int(*px3)[2][2];        //二维数组指针
char(*px4)[3][3][3];    //三维数组指针

px1 = (int (*)[5])1;
px2 = (char (*)[3])1;
px3 = (int (*)[2][2])1;
px4 = (char (*)[3][3][3])1;

px1++;  //int(4) *5  +20 =21
px2++;  //char(1) *3   +3 =4
px3++;  //int(4) *2 *2  +16 =17
px4++;  //char(1) *3 *3 *3 +9 =10

printf("%d %d %d %d \n",px1,px2,px3,px4);

数组指针的使用

//第一种:
int arr[] = {1,2,3,4,5,6,7,8,9,0}
int(*px)[10]=&arr
//*px 是啥类型? => int[10] 数组类型
//px[0] 等价于 *px 所以 *px 也等于 int[10]数组
printf("%d %d \n",(*px)[0],px[0][0]);

px++; //后 (*px)[0]就访问整个数组地址后的地址内的数据


//第二种:
int arr[3][3] = {
    {1,2,3},
    {4,5,6},
    {7,8,9}
};

//此时的 px指针 指向的 {1,2,3}这个数组的首地址
int(*px)[3] = &arr[0]; 

// *px -> 此时就是数组{1,2,3}本身

//越过第一个数组 此时px指针指向 {4,5,6}的首地址
px++; 

printf("%d %d \n",(*px)[0],px[0][0]);
//这里打印的就是 4 4

二维数组指针可以访问一维数组吗?

int arr[] = {1,2,3,4,5,6,7,8,9,0};
int(*px)[2][2] = (int(*)[2][2])arr;

//思考:
// *px 是什么类型 
//int[2][2] 二维数组

//(*px)[1][1]的值是什么? px[0][1][1]的值是什么
//4

相关文章

  • C语言21 指针数组与数组指针

    C语言21 指针数组与数组指针 指针数组的定义 指针数组的赋值 结构体指针数组 分析下面的代码 数组指针的定义 数...

  • 指针数组和数组指针

    指针数组|存储指针的数组 在C语言和C++语言中,数组元素全为指针的数组称为指针数组。 例如:int *p[10]...

  • C语言的指针与数组(进阶篇之一)

    一、一维数组与指针 (1).数组指针在C语言中,数组的首地址称为数组指针。而C++规定,数组的首地址可用数组名a表...

  • C语言中的指针与数组

    C语言中的指针与数组 @(C语言)[排序算法, 快速排序, C实现] 引言 相信指针与数组是不少同学在初学C语言时...

  • 指针数组&数组指针

    本节继续讨论C语言中的指针。 指针数组&数组指针 先理解一下什么是指针数组和数组指针,指针数组的实质是个数组,这个...

  • 02-C语言的指针

    02-C语言的指针 目标 C语言指针释义 指针用法 指针与数组 指针与函数的参数 二级指针 函数指针 指针在C中很...

  • 再学C语言之指针要点

    C之字符数组 C之指针引用字符串 C语言之数组指针 数组指针:首先它是一个指针,它指向数组指针数组:首先它是一个数...

  • 指针与数组的区别和联系

    原文地址:指针与数组的区别和联系作者:zhenhuaqin 一.指针与数组的联系: 指针与数组是C语言中很重要的两...

  • C语言

    C 指针、指针变量、函数指针、指针函数、指针数组、数组指针、C 数组

  • ndk02_指针运算,函数参数与指针,数组指针,二级指针

    一、指针运算 二、数组与指针 三、指针和函数参数 四、指针数组 五、 二级指针 六、知识要点 1、C语言中的函数如...

网友评论

    本文标题:C语言21 指针数组与数组指针

    本文链接:https://www.haomeiwen.com/subject/eayrrftx.html