二级指针三种内存模型示意图

二级指针做输入第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;//printffor (i = 0; i < num; i++){printf("%s\n", myArray[i]);}//sortfor (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);}}}//sortfor (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);//300int len2 = sizeof(myArray[0]);//30int size = len1 / len2;printf("len1:%d, len2:%d, size:%d \n", len1, len2, size);}printfMyArrayd36(myArray, num);sortMyArrayd36(myArray, num);//sortfor (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;
}
