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

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

二级指针做输入第1种内存模型

include

include

include

void printfMyArray() {

  1. //数组 数组中的每一元素是指针 指针数组
  2. char *myArray[] = { "aaaa","cccc","bbbb","1111111111" };
  3. char *tmp = NULL;
  4. int i = 0, j = 0;
  5. int num = 0;
  6. num = sizeof(myArray) / sizeof(myArray[0]);
  7. for (i = 0; i < num; i++)
  8. {
  9. //printf("%s \n", myArray[i]);
  10. printf("%s \n", *(myArray + i));
  11. }
  12. //排序
  13. for (i = 0; i < num; i++)
  14. {
  15. for (j = i; j < num; j++)
  16. {
  17. if (strcmp(myArray[i], myArray[j])>0)
  18. {
  19. tmp = myArray[i];//交换的是数组元素 指针的值
  20. myArray[i] = myArray[j];
  21. myArray[j] = tmp;
  22. }
  23. }
  24. }
  25. printf("排序后:\n");
  26. for (i = 0; i < num; i++)
  27. {
  28. //printf("%s \n", myArray[i]);
  29. printf("%s \n", *(myArray + i));
  30. }

}

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;

  1. //排序
  2. for (i = 0; i < num; i++)
  3. {
  4. for (j = i; j < num; j++)
  5. {
  6. if (strcmp(myArray[i], myArray[j])>0)
  7. {
  8. tmp = myArray[i]; //交换的是数组元素 交换的是指针的值 既改变指针指向 详见图
  9. myArray[i] = myArray[j];
  10. myArray[j] = tmp;
  11. }
  12. }
  13. }

}

void main() { //printfMyArray();

  1. //数组 数组中的每一元素是指针 指针数组
  2. char *myArray[] = { "aaaa","cccc","bbbb","1111111111" };
  3. char *tmp = NULL;
  4. int i = 0, j = 0;
  5. int num = 0;
  6. num = sizeof(myArray) / sizeof(myArray[0]);
  7. printfMyArray1(myArray, num);
  8. sortMyArray1(myArray, num);
  9. printf("排序后:\n");
  10. for (i = 0; i < num; i++)
  11. {
  12. printf("%s \n", *(myArray + i));
  13. }
  14. system("pause");
  15. return 0;

}

二级指针做输入第2种内存模型

define _CRT_SECURE_NO_WARNINGS

include

include

include

void maind361() { char myBuf[30]; char myArray[10][30] = { “aaaa”, “cccc”, “bbbb”, “1111111111” };

  1. char tmpBuf[30];
  2. int i = 0, j = 0;
  3. int num = 4;
  4. //printf
  5. for (i = 0; i < num; i++)
  6. {
  7. printf("%s\n", myArray[i]);
  8. }
  9. //sort
  10. for (i = 0; i < num; i++)
  11. {
  12. for (j = i + 1; j < num; j++)
  13. {
  14. if (strcmp(myArray[i], myArray[j])>0)
  15. {
  16. strcpy(tmpBuf, myArray[i]);//交换的是内存块
  17. strcpy(myArray[i], myArray[j]);
  18. strcpy(myArray[j], tmpBuf);
  19. }
  20. }
  21. }
  22. //sort
  23. for (i = 0; i < num; i++)
  24. {
  25. printf("%s\n", myArray[i]);
  26. }
  27. system("pause");
  28. 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;

  1. //排序
  2. for (i = 0; i < num; i++)
  3. {
  4. for (j = i; j < num; j++)
  5. {
  6. if (strcmp(myArray[i], myArray[j])>0)
  7. {
  8. tmp = myArray[i];//交换的是数组元素 交换的是指针的值 既改变指针指向 详见图
  9. myArray[i] = myArray[j];
  10. myArray[j] = tmp;
  11. }
  12. }
  13. }

}

//笨方法 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];

  1. //排序
  2. for (i = 0; i < num; i++)
  3. {
  4. for (j = i + 1; j < num; j++)
  5. {
  6. if (strcmp(myArray[i], myArray[j])>0)
  7. {
  8. strcpy(tmpBuf, myArray[i]);//交换的是内存块
  9. strcpy(myArray[i], myArray[j]);
  10. strcpy(myArray[j], tmpBuf);
  11. }
  12. }
  13. }

}

void maind36() { char myBuf[30]; char myArray[10][30] = { “aaaa”, “cccc”, “bbbb”, “1111111111” };

  1. char tmpBuf[30];
  2. int i = 0, j = 0;
  3. int num = 4;
  4. /*
  5. 编译器只会关心有10行 每行30列
  6. */
  7. {
  8. int len1 = sizeof(myArray);//300
  9. int len2 = sizeof(myArray[0]);//30
  10. int size = len1 / len2;
  11. printf("len1:%d, len2:%d, size:%d \n", len1, len2, size);
  12. }
  13. printfMyArrayd36(myArray, num);
  14. sortMyArrayd36(myArray, num);
  15. //sort
  16. for (i = 0; i < num; i++)
  17. {
  18. printf("%s\n", myArray[i]);
  19. }
  20. system("pause");
  21. 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;*/

  1. char *p = NULL, *pTmp = NULL;
  2. int tmpcount = 0;
  3. //1 初始化
  4. p = buf1;
  5. pTmp = buf1;
  6. do {
  7. p = strchr(p, c); //2 检索符合条件的位置 p后移 形成差值 挖字符串
  8. if (p != NULL) {
  9. if (p - pTmp > 0) {
  10. strncpy(buf2[tmpcount], pTmp, p - pTmp);
  11. buf2[tmpcount][p - pTmp] = '\0';//把第一行数据变成C风格字符串
  12. tmpcount++;
  13. //3 重新 让p和ptm达到下一次检索的条件
  14. pTmp = p = p + 1;
  15. }
  16. }
  17. else {
  18. break;
  19. }
  20. } while (*p != '\0');
  21. *count = tmpcount;
  22. return 0;

}

void main分割成二维数组() { int ret = 0, i = 0; char *p1 = “abcdef,accd,eeee,aaa,ssss”; char cTem = ‘,’; int nCount; char myArray[10][30];

  1. ret = spitString(p1, cTem, myArray, &nCount);
  2. if (ret != 0) {
  3. printf("fucn spitString() err:%d\n", ret);
  4. }
  5. for (i = 0; i < nCount; i++) {
  6. printf("%s \n", myArray[i]);
  7. }
  8. system("pause");
  9. 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;

  1. do {
  2. p = strchr(p, c); //2 检索符合条件的位置 p后移 形成差值 挖字符串
  3. if (p != NULL) {
  4. if (p - pTmp > 0) {
  5. strncpy(myp[tmpcount], pTmp, p - pTmp);
  6. myp[tmpcount][p - pTmp] = '\0';//把第一行数据变成C风格字符串
  7. tmpcount++;
  8. //3 重新 让p和ptm达到下一次检索的条件
  9. pTmp = p = p + 1;
  10. }
  11. }
  12. else {
  13. break;
  14. }
  15. } while (*p != '\0');
  16. *count = tmpcount;
  17. return 0;

}

void main() { int ret = 0, i = 0; char *p1 = “abcdef,accd,eeee,aaa,ssss”; char cTem = ‘,’; int nCount;

  1. // char myArray[10][30];
  2. char **p = NULL; //主调函数分配内存 char myArray[10][30];
  3. p = (char **)malloc(10 * sizeof(char *)); // 一维 char * array[10]
  4. if (p == NULL) {
  5. return;
  6. }
  7. for (i = 0; i < 10; i++) {
  8. p[i] = (char *)malloc(30 * sizeof(char)); //再二维
  9. }
  10. ret = spitString2(p1, cTem, p, &nCount);
  11. if (ret != 0) {
  12. printf("fucn spitString() err:%d\n", ret);
  13. }
  14. for (i = 0; i < nCount; i++) {
  15. printf("%s \n", p[i]);
  16. }
  17. // 释放内存
  18. for (i = 0; i < nCount; i++) {
  19. free(p[i]);
  20. }
  21. free(p);
  22. system("pause");
  23. return 0;

}