【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )
生活随笔
收集整理的這篇文章主要介紹了
【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、指針數組 和 二維數組 數據 拷貝到 自定義二級指針 中
- 1、函數形參 設計規則
- 2、三種內存模型 對應 函數形參 指針退化規則
- 二、完整代碼示例
一、指針數組 和 二維數組 數據 拷貝到 自定義二級指針 中
將 指針數組 和 二維數組 中的數據 拷貝到 自定義二級指針 內存模型中 , 并進行排序 ;
1、函數形參 設計規則
函數形參 設計規則 : 向 函數中 傳入 二級指針 , 如果只是 使用 該 二級指針 指向的數據 , 可以 直接傳入 二級指針 作為形參 ; 如果 需要 修改 二級指針 的指向 , 則需要 傳入 三級指針 ;
2、三種內存模型 對應 函數形參 指針退化規則
① 指針數組 : 指針數組 參數 , 外層是數組 , 內層是指針 , 外層數組 退化成 指針 , 整體退化成 二級指針 ;
// 指針數組char *p1[] = {"ab", "ef", "cd"};退化為 :二級指針 ;
char **p1② 二維數組 : 二維數組 , 最高維退化成 指針 , 整體退化成 數組指針 , 指向數組的指針 ;
// 二維數組char p2[3][5] = {"13", "35", "22"};退化為 : 數組指針 ;
// 數組指針 char (*p2)[5]③ 二維指針 : 二維指針 作為參數 不退化 ;
// 二級指針char **p3 = NULL;退化為 :
// 二維指針 char **p3代碼示例 :
/*** @brief copy_data 將 指針數組 和 二維數組 中的數據拷貝到 二維指針 中* @param p1 指針數組 參數 , 外層是數組 , 內層是指針 , 外層數組 退化成 指針 , 整體退化成 二級指針* @param count1 指針數組 中的 指針變量元素個數* @param p2 二維數組 , 最高維退化成 指針 , 整體退化成 數組指針 , 指向數組的指針* @param count2 二維數組的 一維數組 個數* @param newp 指向 二級指針 的 三級指針* @param count3p 指向一個數字的指針 , 該 數字是 二級指針 指向的 一級指針 個數* @return*/ int copy_data(char **p1, int count1, char (*p2)[5], int count2, char ***newp, int *count3p)二、完整代碼示例
完整代碼示例 :
#include <stdio.h> #include <stdlib.h> #include <string.h>/* 計算數組 array 大小 */ #define LENGTH(array) (sizeof(array)/sizeof(*array))/*** @brief copy_data 將 指針數組 和 二維數組 中的數據拷貝到 二維指針 中* @param p1 指針數組 參數 , 外層是數組 , 內層是指針 , 外層數組 退化成 指針 , 整體退化成 二級指針* @param count1 指針數組 中的 指針變量元素個數* @param p2 二維數組 , 最高維退化成 指針 , 整體退化成 數組指針 , 指向數組的指針* @param count2 二維數組的 一維數組 個數* @param newp 指向 二級指針 的 三級指針* @param count3p 指向一個數字的指針 , 該 數字是 二級指針 指向的 一級指針 個數* @return*/ int copy_data(char **p1, int count1, char (*p2)[5], int count2, char ***newp, int *count3p) {// 返回值int ret = 0;// 循環控制變量int i = 0, j = 0;// 臨時長度int len = 0;// 創建的新的 二級指針 , 用于存放 指針數組 二維指針 中的數據char **p3 = NULL;// 分配一塊內存 , 這塊內存中存放 count1 + count2 個一級指針p3 = (char **)malloc((count1 + count2) * sizeof(char *));// 驗證指針合法性if (p3 == NULL){ret = -1;return ret;}// 遍歷將 p1 指針數組 中的數據 拷貝到 二級指針 中for (i = 0; i < count1; i++){// 指針數組 中指針 指向的 字符串長度// 最后的 + 1 是加上 \0 字符len = strlen(p1[i]) + 1;// 為 指向字符串的 一級指針 在堆內存中分配內存p3[i] = (char *)malloc( len * sizeof(char)) ;// 如果堆內存分配失敗 , 直接退出if (p3[i] == NULL){return -2;}// 向堆內存中拷貝 字符串 數據strcpy(p3[i], p1[i]);}// 遍歷將 p2 二維數組 中的數據 拷貝到 二級指針 中// 之前已經拷貝了 count1 個 , 因此從第 count1 + 1 位置開始拷貝// 第 count1 + 1 個的索引從 0 開始 , 其索引是 count1 ;for (j = 0; j < count2; j++){// 計算 二維數組 中第 j 個一維數組 字符串長度// 最后的 + 1 是加上 \0 字符len = strlen(p2[j]) + 1;// 為 指向字符串的 一級指針 在堆內存中分配內存p3[count1 + j] = (char *)malloc(len * sizeof(char));// 堆內存分配失敗 , 退出if (p3[count1 + j] == NULL){return -3;}// 向堆內存中拷貝 字符串 數據strcpy(p3[count1 + j], p2[j]);}// p3 二維指針 中存儲的 字符串個數len = count1 + count2;// 指針 間接賦值 作為 返回值*count3p = len; // 二維指針 賦值給 三維指針形參 指向的內存地址*newp = p3; // 字符串個數 賦值return 0; }/*** @brief sort_data 二級指針 指向的 一級指針 數據排序* 需要修改 二級指針 指向的一級指針次序* 二級指針 不需要修改 , 因此這里傳入 二級指針即可* 如果需要修改 二級指針 , 則需要傳入 三級指針* @param p3 二級指針 數據* @param num3 二級指針 指向的 一級指針 個數* @return*/ int sort_data(char **p3, int len) {// 循環控制變量int i = 0, j = 0;// 交換 字符串 時的臨時變量char *p = NULL;// 驗證指針合法性if(p3 == NULL){return -1;}// p3 指向的 若干 字符串 之間的排序for (i = 0; i < len; i++){for (j = i + 1; j < len; j++){if ( strcmp(p3[i], p3[j]) > 0 ){// 交換 i, j 位置的 一級指針p = p3[i];p3[i] = p3[j];p3[j] = p;}}}return 0; }/*** @brief sort_data 二級指針 指向的 一級指針 數據排序* 需要修改 二級指針 指向的一級指針次序* 二級指針 不需要修改 , 因此這里傳入 二級指針即可* 如果需要修改 二級指針 , 則需要傳入 三級指針* @param p3 二級指針 數據* @param num3 二級指針 指向的 一級指針 個數* @return*/ int print_data(char **p3, int len) {// 循環控制變量int i = 0;// 交換 字符串 時的臨時變量char *p = NULL;// 驗證指針合法性if(p3 == NULL){return -1;}// p3 指向的 若干 字符串 之間的排序for (i = 0; i < len; i++){printf("%s\n", p3[i]);}return 0; }/*** @brief 主函數入口* @return*/ int main(int argc, char* argv[], char**env) {// 指針數組char *p1[] = {"ab", "ef", "cd"};// 二維數組char p2[3][5] = {"13", "35", "22"};// 二級指針char **p3 = NULL;// 存儲 p3 指向的一級指針個數int len3 = 0;// 將 指針數組 二維數組 數據 拷貝到 二級指針 中copy_data(p1, 3, p2, 3, &p3, &len3);// 拷貝之后的結果print_data(p3, len3);// 數據排序sort_data(p3, len3);// 打印排序之后的結果printf("\nSort :\n");print_data(p3, len3);// 命令行不要退出system("pause");return 0; }執行結果 :
ab ef cd 13 35 22Sort : 13 22 35 ab cd ef 請按任意鍵繼續. . .總結
以上是生活随笔為你收集整理的【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C 语言】结构体 ( 结构体中嵌套二级
- 下一篇: 【C 语言】结构体 ( 结构体浅拷贝 )