指针与一维、二维数组
++++++++++示例程序++++++++++
#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)也不能成立。