指针知识梳理9-指针数组

Posted ldxsuanfa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针知识梳理9-指针数组相关的知识,希望对你有一定的参考价值。

1、基本概念
指针数组:本质是数组。数组的每一个元素是指针,数组的每一个元素能够存储地址。

2、基本定义
(1)先回想,数组定义基本模型
type a[len];
訪问 数组的每一个成员用 a[i];
每一个成员所占内存大小 sizeof(type);
数组总共占内存大小 ?sizeof(a) = sizeof(type)*len;
(2)指针数组
假设学会了指针,学会了数组,到了这里就是一个综合应用的问题。


依照以上模型:
----------------------------------------------------------------
type 为 char*
char* a[5];
定义数组a,数组每一个元素的类型为 char*。存储地址,a[i]占4个字节。
那么能够写例如以下代码:
char b;
char c[10];
a[0] = "hello";
a[1] = (char*)malloc(5);
a[2] = &b;
a[3] = &c[0];

a[4] = c;

技术图片


------------------------------------------------------------------
type 为 int*
int* a[5];
定义数组a,数组每一个元素的类型为 int*,存储地址,a[i]占4个字节。
int b;
int c[10];
a[0] = &b;
a[1] = (int*)malloc(sizeof(int)*5);
a[2] = &c[0];

a[3] = c;?

请画内存图


3、综合一维数组名的含义
參照1,指针与一维数组:http://blog.csdn.net/xiaoliu0518/article/details/32710665
參照2,指针的指针:http://blog.csdn.net/xiaoliu0518/article/details/33329833
模型:
type a[10];
type *p;
p+i ?偏移的地址是 i*sizeof(type)
p = &a[0];
p = a;
*(p+i) = p[i];
*(a+i) = a[i];
--------------------------------------------------
假设type为char
char a[10];
char* p;
p = a;
p+i 地址偏移 i个字节,*(p+i)訪问1个字节
---------------------------------------------------
假设type为char*
char* a[10];
char** p;
p = a;
p+i 地址偏移 4*i个字节。*(p+i)訪问4个字节

3、综合应用
#include <stdio.h>
int main()
{
	
	char *a[5];
	char b[10] = "lilei";
	char c[10];
	char d = ‘m‘;
	char **p = a;
	a[0] = "hello";
	a[1] = (char*)malloc(5);
	//安全检查。。

a[2] = b; a[3] = c; a[4] = &d; strcpy(a[1],"bye"); strcpy(a[3],a[2]); for(i = 0;i<4;i++) { printf("a[%d] : %s ",i,a[i]); printf("a[%d] : %s ",i,p[i]); printf("a[%d] : %s ",i,*(p+i)); } printf("a[4]:%c ",*a[4]); printf("a[4]:%c ", *(*(p+4)) ); }




刚開始学习的人一定要多写多练。








以上是关于指针知识梳理9-指针数组的主要内容,如果未能解决你的问题,请参考以下文章

指针知识梳理3-指针作为參数

指针和数组小记

指针的这些知识你知道吗?C语言超硬核指针进阶版3w+字详解+指针笔试题画图+文字详细讲解

字符数组VS字符指针

知识分享:C/C++函数返回二维数组指针

一题诠释C语言指针与数组