十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
int **a可以表达一个二维数组。为什么呢?
创新互联建站专业网站设计制作、成都做网站,集网站策划、网站设计、网站制作于一体,网站seo、网站优化、网站营销、软文推广等专业人才根据搜索规律编程设计,让网站在运行后,在搜索中有好的表现,专业设计制作为您带来效益的网站!让网站建设为您创造效益。
你可以这么理解 * p[3]表达的是一个数组指针,这个指针 p[0]表示的是数组存的第一个地址。而数组实际上是一串连续地址的块。每一个小块存着一个内容。每次访问数组时,你为什么可以用数组名+下标访问呢? //比如a[i];
实际上就是 访问*a+i; * 这个符号可以表示你存的是变量的地址。而数组地址的第一位为int类型变量存的地址(你可以直接使用数组的地址加上单位变量的空间的大小去访问下个元素)。在这个程序中int *p[3] 表示可以存三个int 类型的地址。而p正好把二维数组的三个一维数组的开头的int类型变量的地址给存起来了。
给你举个例子
我现在输出的是地址,是不是连续的?
用*运算符获取地址的内容。
实际上p[i]与 *(p+i)是表达的是同一个意思。只不过只有数组可以定义一个连续的空间
(数组的第一个地址是随机的其他的是连续的。)单独用指针的话会随机分配的
数组的指针可以存三个地址。当然可以访问二维数组了。
#include stdio.h
#include windows.h
#define HEIGHT 22
#define WIDTH 46
#define FN "pet.txt"
void showFile(char * filename, char *arr, int h, int w);
int main()
{
int x, y;
char data[HEIGHT][WIDTH];
showFile (FN,(char *)data,HEIGHT,WIDTH);/*data是指向数组的指针,所以需要转换为char *
*/
/*以下显示怪兽*/
for(x=0;xHEIGHT;x++)
{
for(y=0;yWIDTH;y++)
printf("%c",*(*(data+x)+y)); /* *(*(data+x)+y))=data[x][y] */
printf("\n");
}
return 0;
}
void showFile(char * filename, char *arr, int h, int w)
{
FILE *fp=fopen(filename,"rb"); /*以二进制的方式读取数据,也就是说filename里面的数据
也必须是以二进制形式写入的,否则显示会不正确
*/
if(fp!=NULL)
{
fread(arr,sizeof(char),HEIGHT*WIDTH,fp);
fclose(fp);
}
else
{
printf("Error occured while open file - %s\n",filename);/*打开文件出错*/
exit(1);
}
}
数组名就是指针,例如:
#include stdio.h
void pr(char *p)
{
printf(p);
}
void main(void)
{
char s[] = "abc";
pr(s);
}
扩展资料:
注意事项
非数组类的声明尽量以指针的方式进行比较好。倘若一个指针指向的内存并不是一个数组,那么采用数组名的声明方式或许就会给人产生错误的引导。类似的,如果指向的是一个数组区域,则会给人以更加丰富的信息。例如:
int main(int argc,char* argv[])
{
/* code here */
}
与
int main(int argc,char** argv)
{
/* code here */
}
两种方式完全等价,但是前面一种能够更清晰地看出:这个参数是指向某个元素起始地址的指针,而后面的这种方式则不能够直观地看出这种含义。