二级指针三种内存模型示意图
二级指针做输入第1种内存模型
include
include
include
void printfMyArray() {
//数组 数组中的每一元素是指针 指针数组
char *myArray[] = { "aaaa","cccc","bbbb","1111111111" };
char *tmp = NULL;
int i = 0, j = 0;
int num = 0;
num = sizeof(myArray) / sizeof(myArray[0]);
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));
}
}
void printfMyArray1(char *myArray, int num) { int i = 0; for (i = 0; i < num; i++) { printf(“%s \n”, (myArray + i)); } }
void sortMyArray1(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 main() { //printfMyArray();
//数组 数组中的每一元素是指针 指针数组
char *myArray[] = { "aaaa","cccc","bbbb","1111111111" };
char *tmp = NULL;
int i = 0, j = 0;
int num = 0;
num = sizeof(myArray) / sizeof(myArray[0]);
printfMyArray1(myArray, num);
sortMyArray1(myArray, num);
printf("排序后:\n");
for (i = 0; i < num; i++)
{
printf("%s \n", *(myArray + i));
}
system("pause");
return 0;
}
二级指针做输入第2种内存模型
define _CRT_SECURE_NO_WARNINGS
include
include
include
void maind361() { char myBuf[30]; char myArray[10][30] = { “aaaa”, “cccc”, “bbbb”, “1111111111” };
char tmpBuf[30];
int i = 0, j = 0;
int num = 4;
//printf
for (i = 0; i < num; i++)
{
printf("%s\n", myArray[i]);
}
//sort
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);
}
}
}
//sort
for (i = 0; i < num; i++)
{
printf("%s\n", myArray[i]);
}
system("pause");
return 0;
}
/ 问题的本质是:myArray+1 和第一种的myArray+1 内存模型不一样 也就是指针的步长不一样 指针所指向的内存空间的数据不一样 printfMyArrayd36()行不通 /
void printfMyArrayd360(char *myArray, int num) { int i = 0; for (i = 0; i < num; i++) { printf(“%s \n”, (myArray + i)); } }
void sortMyArrayd360(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 printfMyArrayd36(char myArray[10][30], int num) { int i = 0; for (i = 0; i < num; i++) { printf(“%s \n”, *(myArray + i)); } } void sortMyArrayd36(char myArray[10][30], int num) { int i = 0, 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 maind36() { char myBuf[30]; char myArray[10][30] = { “aaaa”, “cccc”, “bbbb”, “1111111111” };
char tmpBuf[30];
int i = 0, j = 0;
int num = 4;
/*
编译器只会关心有10行 每行30列
*/
{
int len1 = sizeof(myArray);//300
int len2 = sizeof(myArray[0]);//30
int size = len1 / len2;
printf("len1:%d, len2:%d, size:%d \n", len1, len2, size);
}
printfMyArrayd36(myArray, num);
sortMyArrayd36(myArray, num);
//sort
for (i = 0; i < num; i++)
{
printf("%s\n", myArray[i]);
}
system("pause");
return 0;
}
挖字符串
define _CRT_SECURE_NO_WARNINGS
include
include
include
//“abcdef,accd,eeee,aaa,ssss”; 分割成二维数组 int spitString(const char buf1, char c, char buf2[10][30], int count) { /strcpy(buf2[0], “aaaa”); strcpy(buf2[1], “bbbb”); count = 2;*/
char *p = NULL, *pTmp = NULL;
int tmpcount = 0;
//1 初始化
p = buf1;
pTmp = buf1;
do {
p = strchr(p, c); //2 检索符合条件的位置 p后移 形成差值 挖字符串
if (p != NULL) {
if (p - pTmp > 0) {
strncpy(buf2[tmpcount], pTmp, p - pTmp);
buf2[tmpcount][p - pTmp] = '\0';//把第一行数据变成C风格字符串
tmpcount++;
//3 重新 让p和ptm达到下一次检索的条件
pTmp = p = p + 1;
}
}
else {
break;
}
} while (*p != '\0');
*count = tmpcount;
return 0;
}
void main分割成二维数组() { int ret = 0, i = 0; char *p1 = “abcdef,accd,eeee,aaa,ssss”; char cTem = ‘,’; int nCount; char myArray[10][30];
ret = spitString(p1, cTem, myArray, &nCount);
if (ret != 0) {
printf("fucn spitString() err:%d\n", ret);
}
for (i = 0; i < nCount; i++) {
printf("%s \n", myArray[i]);
}
system("pause");
return 0;
} / 内存块在被调用函数内执行 / int spitString2(const char buf1, char c, char **myp/in/, int count) { char p = NULL, pTmp = NULL; int tmpcount = 0; //1 初始化 p = buf1; pTmp = buf1;
do {
p = strchr(p, c); //2 检索符合条件的位置 p后移 形成差值 挖字符串
if (p != NULL) {
if (p - pTmp > 0) {
strncpy(myp[tmpcount], pTmp, p - pTmp);
myp[tmpcount][p - pTmp] = '\0';//把第一行数据变成C风格字符串
tmpcount++;
//3 重新 让p和ptm达到下一次检索的条件
pTmp = p = p + 1;
}
}
else {
break;
}
} while (*p != '\0');
*count = tmpcount;
return 0;
}
void main() { int ret = 0, i = 0; char *p1 = “abcdef,accd,eeee,aaa,ssss”; char cTem = ‘,’; int nCount;
// char myArray[10][30];
char **p = NULL; //主调函数分配内存 char myArray[10][30];
p = (char **)malloc(10 * sizeof(char *)); // 一维 char * array[10]
if (p == NULL) {
return;
}
for (i = 0; i < 10; i++) {
p[i] = (char *)malloc(30 * sizeof(char)); //再二维
}
ret = spitString2(p1, cTem, p, &nCount);
if (ret != 0) {
printf("fucn spitString() err:%d\n", ret);
}
for (i = 0; i < nCount; i++) {
printf("%s \n", p[i]);
}
// 释放内存
for (i = 0; i < nCount; i++) {
free(p[i]);
}
free(p);
system("pause");
return 0;
}