指针数组的基本用法
由若干具有相同数据类型的指针变量构成的集合
指针数组的一般说明形式:
<数据类型> *<指针数组名>[<大小>];
指针数组名表示该数组的起始地址
#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];

如何将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个元素的一维数组
一维数组名取地址,或者二维数组名,都可以赋给他