注意行指针和列指针的使用
行指针不能直接访问二维数组的元素,必须要将行指针转换为列指针才能访问二位数组元素
易混淆的指针:
行指针:
p + i;
*(*(p + i));
*(*(p + i) + j);
&p[i];
(p + i) + j == p + i + j;
列指针:
*(p + i);
*(p + i) + j;
*(p[i] + j);//p[i] + j为 元素p[i][j]的 地址
*(&p[i]);
源代码:
#pragma warning(disable:4996)
#include<stdio.h>
#include<string.h>
#define N 2
void paixu_printf(char (*p)[10])/*定义指向二维数组的指针,
只能定义成指向一个包含10个元素的以为数组
*即每次数组指针只能指向二维数组的一行*/
{
char temp[11];/*一定不能定义为" *temp "
*因为temp需要储存字符串,且要能被改变*/
int i, j;
for (i = 0; i < N - 1; i++)/*第一层控制比较次数*/
{
for (j = 0; j < N - i - 1; j++)/*第二层则为冒泡排序*/
{
if (strcmp(*(&p[j]), *(p+j+1)) > 0)/*需要注意的是" p+j "是行指针,指向的是第二行
*要在前面加上 * ,转化为列指针,才能访问具体的元素
* *(p+j)等价于p[j]或p[j][0]*/
{
strcpy(temp, *(p + j));
strcpy(*(p + j), *(p + j + 1));
strcpy(*(p + j + 1), temp);
}
}
}
printf("排序结果:\n");
for (i = 0; i < N; i++)
{
printf("%s\n", p + i);
}
}
int main()
{
char arry[N][10];
int i;
printf("请输入%d个字符串\n", N);
for (i = 0; i < N; i++)
{
printf("请输入第%d个字符串:", i + 1);
gets_s(arry[i]);
}
paixu_printf(arry);
}