指针数组
  C

指针数组

 次点击
13 分钟阅读

指针数组的基本用法

由若干具有相同数据类型的指针变量构成的集合

指针数组的一般说明形式:
<数据类型> *<指针数组名>[<大小>];
指针数组名表示该数组的起始地址

#include <stdio.h>

int main(){
	int a = 10, b = 20, c = 30;
	int * p[3];

	p[0] = &a;
	p[1] = &b;
	p[2] = &c;

	printf("a b c:%d %d %d\n",a,b,c);
	printf("a b c:%d %d %d\n",*p[0],*p[1],*p[2]);
	printf("a b c:%p %p %p\n",&a,&b,&c);
	printf("a b c:%p %p %p\n",p[0],p[1],p[2]);

	return 0;
}


/*
a b c:10 20 30
a b c:10 20 30
a b c:0x7ffff227d5f4 0x7ffff227d5f8 0x7ffff227d5fc
a b c:0x7ffff227d5f4 0x7ffff227d5f8 0x7ffff227d5fc
*/

如何计算指针数组占用的内存空间

printf("sizeof:%ld\n",sizeof(p));  
//24

指针数组名+1移动几个字节

printf("%p %p\n",p,p + 1);
//0x7ffc497014a0 0x7ffc497014a8

例1

#include <stdio.h>

int main(){
	int a[ ] = {1,2,3,4,5,6,7,8};
	int * p[8];
	int i;

	for(i = 0;i < sizeof(a) / sizeof(int);i++){
		p[i] = &a[i];
	}
	for(i = 0;i < sizeof(a) / sizeof(int);i++){
		printf("%d\n",*p[i]);
	}
	return 0;
}

/*
1
2
3
4
5
6
7
8
*/

例2

#include <stdio.h>

int main(){
	char * s[] = {"BwiJing","ShangHai","GuangZhou"};
	int i;

	for (i = 0; i < sizeof(s) / sizeof(char *); i++){
		printf("%s\n",s[i]);
	}
	return 0;
}

/*
BwiJing
ShangHai
GuangZhou
*/

指针数组和二维数组

int a[2][3]={{3,7,9},{2,5,1}};
int * p = 如何初始化?

声明一个指针数组
int * p[], a[2][3];
把一维数组a[0]和a[1]的首地址分别赋予指针变量数组的数组元素p[0]和p[1]
p[0] = a[0]; p[1] = a[1];

image-ajgP.png

如何将b[0][1]取出来?

#include <stdio.h>

int main(){
	int a[2][3] = {{3,5,1},{3,6,9}};
	int * p[2];

	p[0] = a[0];//&a[0][0]
	p[1] = a[1];//&a[1][0]

	printf("%d\n",a[0][1]);
	printf("%d\n",*(p[0] + 1));
	printf("%d\n",p[0][1]);
	return 0;
}

/*
5
5
5
*/

如何通过指针遍历二维数组?

#include <stdio.h>

int main(){
	int a[2][3] = {{3,5,1},{3,6,9}};
	int * p[2];
	int i,j;

	p[0] = a[0];
	p[1] = a[1];

	for(i = 0;i < sizeof(a) / sizeof(a[0]);i++){
		for(j = 0;j < sizeof(a[0]) / sizeof(int);j++){
			printf("%d ",a[i][j]);
			printf("%d %d ",*(p[i] + j),p[i][j]);
		}
		printf("\n");
	}

	return 0;
}

/*
3 3 3 5 5 5 1 1 1 
3 3 3 6 6 6 9 9 9 
*/

数组指针和指针数组的区别

int *p[5]int (*p)[5]有什么区别

int *p[5]
指针数组 是一维数组 每个元素都是int *
指针数组通常结合二维数组使用,存储每行首元素的地址
本质是数组,存储内容是指针而已

int (*p)[5]
是一个指向数组的指针
本质是指针,指向的内容是含有5个元素的一维数组
一维数组名取地址,或者二维数组名,都可以赋给他

© 本文著作权归作者所有,未经许可不得转载使用。