第一种内存模型
写出来,其实很简单:
void main()
{
//数组 数组中的每一个元素是指针 指针数组
char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", "111111"};
printf("hello...\n");
system("pause");
return ;
}
其实,myArray就是一个数组,只不过每个元素都装的是指针。即指针数组。
对于这种内存模型要掌握到如下程度:1.会排序;2.指针作函数参数排序;3.清楚的画出这种数据模型的示意图。
下面看一下这种数组如何打印,那要知道,指针数组,也是数组,那直接按打印数组的方式来调用,就可以了呀! :
void main()
{
int i = 0, j = 0;
int num = 0;
char *tmp = NULL;
//数组 数组中的每一个元素是指针 指针数组
char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", "111111"};
//打印
num = sizeof(myArray)/sizeof(myArray[0]);
for (i=0; i<num; i++)
{
printf("%s \n", myArray[i]); //这两种方式效果一样
printf("%s \n", *(myArray+i) );
}
printf("hello...\n");
system("pause");
return ;
}
接着,再进行排序:
//排序
for (i=0; i<num; i++)
{
for (j=i; j<num; j++)
{
if (strcmp(myArray[i], myArray[j]) > 0 )
{
tmp = myArray[i]; //注意 交换的是数组元素 即交换的是指针数组中存放的指针的值
myArray[i] = myArray[j];
myArray[j] = tmp;
}
}
}
接下来,看看指针作函数参数,即将执行部分封装成函数:
void printMyArray11(char **myArray, int num)
{
int i = 0;
for (i=0; i<num; i++)
{
//printf("%s \n", myArray[i]);
printf("%s \n", *(myArray+i) );
}
}
void sortMyArray11(char **myArray, int num)
{
int i =0 , j = 0;
char *tmp = NULL;
//排序
for (i=0; i<num; i++)
{
for (j=i; j<num; j++)
{
if (strcmp(myArray[i], myArray[j]) > 0 )
{
tmp = myArray[i]; //注意 交换的是数组元素 交换的是指针的值 //改变指针的指向
myArray[i] = myArray[j];
myArray[j] = tmp;
}
}
}
}
sortMyArray11函数的形参就是二级指针,对应的main函数中传入参数为myArray, 这个地方我当时糊涂了,觉得在主函中应该传入一个**myArray,我这样想是错的,因为,对于char *myArray[]来说,myArray是一个一级指针数组变量,那么其中的内容是"aaaaaa", "ccccc", "bbbbbb", "111111",注意,这4个其实应该是指针变量,但这里为了示意方便,就以abc1,这种简单的内容举例了,然后,如何用指针作函数参数调用一个一级指针数组变量该怎么调呢?可以这么想,以指针作函数参数调用一个数组,就是把数组名给传进去,因为数组名很特殊,它传入的是对应的数组的首地址。那么,同理,通过二级指针调用一级指针数组,就是把一级指针数组的数组名给传进去,就行了!
void main211()
{
int i = 0, j = 0;
int num = 0;
char *tmp = NULL;
//数组 数组中的每一个元素是指针 指针数组
char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", "111111"};
//打印
num = sizeof(myArray)/sizeof(myArray[0]);
printf("排序之前\n");
printMyArray11(myArray, num);
sortMyArray11(myArray, num);
printf("排序之后\n");
printMyArray11(myArray, num);
printf("hello...\n");
system("pause");
return ;
}
这种内存模型图,其实,也很简单,本质就是数组嘛!:
第二种内存模型
跟第一种模型一样,先上最最基础的结构:
void main()
{
char tmpBuf[30];
char myArray[10][30] = {"aaaaaa", "ccccc", "bbbbbbb", "1111111111111"};
printf("hello...\n");
system("pause");
return ;
}
第二种模型也是数组,同理按照第一种模型,排序,打印和封装成函数。
先看打印:
//打印
printf("排序之前\n");
for (i=0; i<num; i++)
{
printf("%s\n", myArray[i]);
}
再看排序:
strcmp函数用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
for (i=0; i<num; i++)
{
for (j=i+1; j<num; j++)
{
if (strcmp (myArray[i], myArray[j]) > 0)
{
strcpy(tmpBuf, myArray[i]); //交换的是内存块
strcpy(myArray[i], myArray[j]);
strcpy(myArray[j], tmpBuf);
}
}
}
这个地方需要注意,和之前的都不一样:
strcpy(tmpBuf, myArray[i]); //交换的是内存块
这里交换的是内存块,一个内存块里面还可以细分存放的都是什么值。
封装成函数:
void printMyArray02(char myArray[10][30], int num)
{
int i = 0;
for (i=0; i<num; i++)
{
//printf("%s \n", myArray[i]);
printf("%s \n", *(myArray+i) ); //
}
}
//交换的是内存块。。。。。。。。
void sortMyArray02(char myArray[10][30], int num)
{
int i, j = 0;
char tmpBuf[30];
for (i=0; i<num; i++)
{
for (j=i+1; j<num; j++)
{
if (strcmp (myArray[i], myArray[j]) > 0)
{
strcpy(tmpBuf, myArray[i]); //交换的是内存块
strcpy(myArray[i], myArray[j]);
strcpy(myArray[j], tmpBuf);
}
}
}
}
//打印 排序
//封装成函数
void main333()
{
int i = 0, j = 0;
int num = 4;
char myBuf[30];
char tmpBuf[30];
char myArray[10][30] = {"aaaaaa", "ccccc", "bbbbbbb", "1111111111111"};
//myArray: 编译器只会关心:有10行 ,每行30列。。。。。干什么?myArray+1 多维数组名的本质,
{
int len1 = sizeof(myArray);
int len2 = sizeof(myArray[0]);
int size = len1/len2;
printf("len1:%d , len2:%d size:%d \n", len1, len2, size);
}
//打印
printf("排序之前\n");
printMyArray02(myArray, num);
sortMyArray02(myArray, num);
//打印
printf("排序之后\n");
printMyArray02(myArray, num);
printf("hello...\n");
system("pause");
return ;
}
以上完全是参照的第一种模型中的指针作函数参数来作的,只不过是把数组的形式写成了和第二种的一样,myArray[10][30],
需要注意的是:
第一种模型交换的是指针的指向,第二种模型交换的是内存块儿、
两种区别的本质是:第2种内存模型 的 myArray + 1 与 第1种内存模型 myArray + 1 不一样 ;
指针的步长不一样 指针所指向的内存空间的数据类不一样 。。。。
总体代码
dm02_二级指针做输入_第1种内存模型.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void main21()
{
int i = 0, j = 0;
int num = 0;
char *tmp = NULL;
//数组 数组中的每一个元素是指针 指针数组
char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", "111111"};
//打印
num = sizeof(myArray)/sizeof(myArray[0]);
printf("排序之前\n");
for (i=0; i<num; i++)
{
//printf("%s \n", myArray[i]);
printf("%s \n", *(myArray+i) );
}
//排序
for (i=0; i<num; i++)
{
for (j=i; j<num; j++)
{
if (strcmp(myArray[i], myArray[j]) > 0 )
{
tmp = myArray[i]; //注意 交换的是数组元素 交换的是指针的值
myArray[i] = myArray[j];
myArray[j] = tmp;
}
}
}
printf("排序之后\n");
for (i=0; i<num; i++)
{
//printf("%s \n", myArray[i]);
printf("%s \n", *(myArray+i) );
}
printf("hello...\n");
system("pause");
return ;
}
void printMyArray11(char **myArray, int num)
{
int i = 0;
for (i=0; i<num; i++)
{
//printf("%s \n", myArray[i]);
printf("%s \n", *(myArray+i) );
}
}
void sortMyArray11(char **myArray, int num)
{
int i =0 , j = 0;
char *tmp = NULL;
//排序
for (i=0; i<num; i++)
{
for (j=i; j<num; j++)
{
if (strcmp(myArray[i], myArray[j]) > 0 )
{
tmp = myArray[i]; //注意 交换的是数组元素 交换的是指针的值 //改变指针的指向
myArray[i] = myArray[j];
myArray[j] = tmp;
}
}
}
}
void main211()
{
int i = 0, j = 0;
int num = 0;
char *tmp = NULL;
//数组 数组中的每一个元素是指针 指针数组
char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", "111111"};
//打印
num = sizeof(myArray)/sizeof(myArray[0]);
printf("排序之前\n");
printMyArray11(myArray, num);
sortMyArray11(myArray, num);
printf("排序之后\n");
printMyArray11(myArray, num);
printf("hello...\n");
system("pause");
return ;
}
dm03_二级指针做输入_第2种内存模型.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
//打印 排序
//封装成函数
void main31()
{
int i = 0, j = 0;
int num = 4;
char myBuf[30];
char tmpBuf[30];
char myArray[10][30] = {"aaaaaa", "ccccc", "bbbbbbb", "1111111111111"};
//打印
printf("排序之前\n");
for (i=0; i<num; i++)
{
printf("%s\n", myArray[i]);
}
for (i=0; i<num; i++)
{
for (j=i+1; j<num; j++)
{
if (strcmp (myArray[i], myArray[j]) > 0)
{
strcpy(tmpBuf, myArray[i]); //交换的是内存块
strcpy(myArray[i], myArray[j]);
strcpy(myArray[j], tmpBuf);
}
}
}
//打印
printf("排序之后\n");
for (i=0; i<num; i++)
{
printf("%s\n", myArray[i]);
}
printf("hello...\n");
system("pause");
return ;
}
//问题的本质是:dm03_二级指针做输入_第2种内存模型 的 myArray + 1
// dm03_二级指针做输入_第1种内存模型 myArray + 1 不一样 ;
//指针的步长不一样 指针所指向的内存空间的数据类不一样 。。。。
void printMyArray02_err(char **myArray, int num)
{
int i = 0;
for (i=0; i<num; i++)
{
//printf("%s \n", myArray[i]);
printf("%s \n", *(myArray+i) ); //
}
}
void printMyArray02(char myArray[10][30], int num)
{
int i = 0;
for (i=0; i<num; i++)
{
//printf("%s \n", myArray[i]);
printf("%s \n", *(myArray+i) ); //
}
}
//交换的是内存块。。。。。。。。
void sortMyArray02(char myArray[10][30], int num)
{
int i, j = 0;
char tmpBuf[30];
for (i=0; i<num; i++)
{
for (j=i+1; j<num; j++)
{
if (strcmp (myArray[i], myArray[j]) > 0)
{
strcpy(tmpBuf, myArray[i]); //交换的是内存块
strcpy(myArray[i], myArray[j]);
strcpy(myArray[j], tmpBuf);
}
}
}
}
//打印 排序
//封装成函数
void main333()
{
int i = 0, j = 0;
int num = 4;
char myBuf[30];
char tmpBuf[30];
char myArray[10][30] = {"aaaaaa", "ccccc", "bbbbbbb", "1111111111111"};
//myArray: 编译器只会关心:有10行 ,每行30列。。。。。干什么?myArray+1 多维数组名的本质,
{
int len1 = sizeof(myArray);
int len2 = sizeof(myArray[0]);
int size = len1/len2;
printf("len1:%d , len2:%d size:%d \n", len1, len2, size);
}
//打印
printf("排序之前\n");
printMyArray02(myArray, num);
sortMyArray02(myArray, num);
//打印
printf("排序之后\n");
printMyArray02(myArray, num);
printf("hello...\n");
system("pause");
return ;
}