@lishuhuakai
2015-05-17T13:47:45.000000Z
字数 2451
阅读 1496
二维指针
练习
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
//直接定义一个数组的指针
//a是数组首元素的地址
int a[5] = { 2, 3, 4, 5, 6 };
int(*p)[5] = &a; //p是数组指针
//1.myarray也是数组首元素的地址
//2.myarray是一个常量指针
//3.myarray是一个数组指针
int myarray[3][5];
for (int i = 0; i < 5; ++i)
{
printf("%d\n", (*p)[i]);
}
//&a 步长 5*4 = 20;
int tmp = 0;
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 5; ++j)
{
myarray[i][j] = tmp++;
}
}
printf("myarray:%d myarray + 1:%d\n", myarray, myarray + 1);
printf("&a:%d &a + 1:%d\n", &a, &a + 1);
p = myarray; //很神奇的地方
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 5; ++j)
{
p[i][j] = tmp++;
printf("%d ", p[i][j]);
}
}
system("pause");
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//1.不管是几维数组都是线性存储的,所以说会存在多为数组做函数参数退化的问题。
//2.多维数组做函数参数的时候,二维数组能够勉强表达出来,但是三维数组,四维数组就表达不出来了。
//结论:指针做函数参数,有效的内存维数,只到二级..如果你看到三级指针,四级指针,它表示的不是内存的维数。
void printfTwoArray(int *a, int num)
{
for (int i = 0; i < num; i++)
{
printf("%d ", a[i]); //从这里的输出结果可以看出多维数组在内存里线性存储
}
}
//需要告诉编译器要跳多远
void myfunc(int a[][10])
{
}
void main()
{
int myarray[3][5];
int tmp = 0;
int *p = NULL;
//定义为一个数组指针
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 5; ++j)
{
myarray[i][j] = tmp++;
}
}
p = (int *)myarray;
printfTwoArray(p, 3 * 5);
system("pause");
}
我们查看下面的一段代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//指针类型不一样=====》内存模型不一样
//没有类型,哪来指针!
int printfOneArray_01(char buf[64], int iNum)
{
for (int i = 0; i < iNum; ++i)
{
printf("%s\n", buf[i]);
}
return 0;
}
int printfOneArray_02(char buf[], int iNum)
{
for (int i = 0; i < iNum; ++i)
{
printf("%s\n", buf[i]);
}
return 0;
}
int printfOneArray_03(char **buf, int iNum)
{
for (int i = 0; i < iNum; ++i)
{
printf("%s\n", buf[i]);
}
return 0;
}
//比较下面函数参数的三种写法
int printfTwoArray_01(char buf[10][30], int iNum)
{
for (int i = 0; i < iNum; ++i)
{
printf("%s\n", buf[i]);
}
return 0;
}
int printfTwoArray_02(char buf[][30], int iNum)
{
for (int i = 0; i < iNum; ++i)
{
printf("%s\n", buf[i]);
}
return 0;
}
int printfTwoArray_03(char(*buf)[30], int iNum)
{
for (int i = 0; i < iNum; ++i)
{
printf("%s\n", buf[i]);
}
return 0;
}
int sortArrayStr(char myArray[10][30], int iNum)
{
//排序
char buf[30];
for (int i = 0; i < 4; i++)
{
for (int j = i + 1; j < 4; ++j)
{
if (strcmp(myArray[i], myArray[j]) > 0)
{
strcpy_s(buf, myArray[i]);
strcpy_s(myArray[i], myArray[j]);
strcpy_s(myArray[j], buf);
}
}
}
return 0;
}
//
//int array[10]===>int *===>
void main()
{
char myArray[10][30];
//二维数组的数组名代表什么呢?
strcpy_s(myArray[1], "aaaaa");
strcpy_s(myArray[0], "bbbbb");
strcpy_s(myArray[4], "ccccc");
strcpy_s(myArray[5], "ddddd");
strcpy_s(myArray[2], "eeeee");
strcpy_s(myArray[3], "fffff");
//打印第二种内存模型
printf("第二种内存模型排序之前:\n");
printfTwoArray_02(myArray, 5);
//printfArr01(myArray, 4); //无法使用
sortArrayStr(myArray, 5);
printf("第二种内存模型排序之后\n");
printfTwoArray_02(myArray, 5);
system("pause");
}