指针与一维、二维数组

++++++++++示例程序++++++++++

#include<stdio.h>

void main()

{

char m[100]={"abcdefghijklmnopq"};

int i,j;

 

//用数组名做指针输出数据

//第一种方式

printf("%s\n",m);

//第二种方式

for(i=0;m[i]!='\0';i++)

printf("%c",*(m+i));  【注意点1】

printf("\n");

 

//通过定义指针型变量输出

char *p=m;//将数组首地址赋给指针变量p

//第一种方式

printf("%s\n",p);

//第二种方式

for(i=0;m[i]!='\0';i++)

printf("%c",*p++);  /*  这里的*p++也可以写成*(p+i)  */  【注意点2】

printf("\n");

}

 

重点知识概括与总结:由【注意点1】和【注意点2】对比我们可以发现一个数组方面的知识点。和在C语言中,数组名是一个地址常量,不能对这进行赋值和自增自减运算,由数组名代表它的首地址。所以在【注意点1】那块我们不能将*(m+i)替换为*m++

 

一、指针与二维数组

 

++++++++++示例程序++++++++++

 

#include<stdio.h>

void main()

{

char m[3][10]={{"aaaaaaaaa"},{"bbbbbbbbb"},{"ccccccccc"}};

 

//用数组名做指针输出

//第一种方式

for(int i=0;i<3;i++)

printf("%s\n",m+i);  /*  这里的m[i],也可以写成m+i  */  【注意点3】

//第二种方式

for(i=0;i<3;i++)

{

for(int j=0;m[i][j]!='\0';j++)

printf("%c",*(*(m+i)+j));  /*  这里的*(*(m+i)+j)等价于m[i][j],也可以写成*(m[i]+j)  */

printf("\n");

}

}


重点知识概括与总结:必须注意的是对二维及以上字符型数组来说,每个最小行单位必须留出最后一个空位置留给’\0’,对其它类型的字符型数组和int型数组则无此规则。

 

在二维数组中无法通过定义一个指针型变量*p来指向二维数组首行首列地址对这个数组进行输出,如以下输出做法则为错。

 

char *p=&m[0][0];

for(i=0;i<3;i++)

printf("%s\n",p+i);

上边的p+i无法与示例程序中的【注意点3】等价,这里的p+i只能对数组首行进行操作,如printf("%s\n",p+i);i=0时,会打印出二维数组的首行所有元素。i=1时从首行第二个元素开始打印,到最后一个元素停止打印。

 

 

for(i=0;i<3;i++)

{

for(int j=0;m[i][j]!='\0';j++)

printf("%s\n",*(*(p+i)+j));

printf("\n");

}

这里的输出方式则是完全错误的,当然将*(*(p+i)+j)换做*(p[i]+j)也不能成立

全部评论

相关推荐

10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务