[大師C語言(第四十一篇)]C語言指針數組與數組指針技術詳解

C語言中的指針和數組是兩個核心概念,它們在許多高級編程任務中扮演著重要角色。本文將深入探討C語言中的指針數組與數組指針,包括它們的基本概念、使用場景和技術細節。我們將通過詳細的解釋和實用的代碼案例來展示如何有效地使用這些技術。

第一部分:指針數組

1.1 指針數組的基本概念

指針數組是一個數組,其元素是指針。這意味著每個元素都存儲了一個地址,該地址指向某個數據類型的一個實例。指針數組的聲明方式是在數組名前加上指針運算符*和數組大小。

#include <stdio.h>int main() {int a = 1, b = 2, c = 3;int *arr[3] = {&a, &b, &c}; // 指針數組,存儲整型變量的地址for (int i = 0; i < 3; i++) {printf("%d ", *arr[i]); // 輸出指針數組指向的整型值}return 0;
}

在上面的代碼中,我們聲明了一個整型指針數組arr,它包含三個元素,每個元素都是一個指向整型變量的指針。通過解引用這些指針,我們可以訪問它們所指向的整型值。

1.2 指針數組的用途

指針數組常用于以下場景:

  • 存儲一組字符串的地址,便于處理和訪問。
  • 在函數參數中傳遞多個同類型參數的地址,避免使用可變長參數列表。
  • 在排序算法中,存儲元素地址以便于交換和比較。
#include <stdio.h>int main() {char *strings[] = {"apple", "banana", "cherry"}; // 指針數組,存儲字符串的地址for (int i = 0; i < 3; i++) {printf("%s\n", strings[i]); // 輸出指針數組指向的字符串}return 0;
}

在上面的代碼中,我們聲明了一個字符型指針數組strings,它存儲了三個字符串的地址。通過遍歷這個數組,我們可以輕松地輸出這些字符串。

1.3 指針數組的指針運算

指針數組的指針運算與普通數組的指針運算類似,可以通過指針算術運算來訪問數組元素。例如,可以使用arr[i]來訪問指針數組的第i個元素,也可以使用arr + i來獲取指向第i個元素的指針。

#include <stdio.h>int main() {int a = 1, b = 2, c = 3;int *arr[3] = {&a, &b, &c}; // 指針數組,存儲整型變量的地址int **ptr = arr; // 指向指針數組的指針for (int i = 0; i < 3; i++) {printf("%d ", **(ptr + i)); // 輸出指針數組指向的整型值}return 0;
}

在上面的代碼中,我們聲明了一個指向整型指針數組的指針ptr,并通過指針算術運算來訪問數組元素所指向的整型值。

總結

在本文的第一部分中,我們介紹了C語言中指針數組的基本概念、用途和指針運算。指針數組是一個數組,其元素是指針,用于存儲地址信息。通過指針數組,我們可以方便地處理和訪問一組數據,如字符串或函數參數。在下一部分中,我們將探討數組指針的概念和使用,進一步深入理解C語言中的指針和數組技術。

第二部分:數組指針

2.1 數組指針的基本概念

數組指針是一個指針,它指向一個數組。與指針數組不同,數組指針本身是一個指針,而不是一個數組。數組指針的聲明方式是在指針名后加上方括號[]和數組大小。數組指針通常用于指向數組的第一個元素,并通過指針算術運算來訪問數組中的其他元素。

#include <stdio.h>int main() {int arr[3] = {1, 2, 3}; // 一個整型數組int (*ptr)[3] = &arr;   // 數組指針,指向整型數組arrfor (int i = 0; i < 3; i++) {printf("%d ", (*ptr)[i]); // 通過數組指針訪問數組元素}return 0;
}

在上面的代碼中,我們聲明了一個整型數組arr和一個數組指針ptr。數組指針ptr指向數組arr的第一個元素,我們可以通過解引用ptr來訪問數組元素。

2.2 數組指針的用途

數組指針常用于以下場景:

  • 在函數參數中傳遞數組,特別是當數組的大小不是固定值時。
  • 訪問多維數組的行或列。
  • 在指針算術運算中,用于計算數組元素的地址。
#include <stdio.h>void print_array(int (*arr)[3], int size) {for (int i = 0; i < size; i++) {for (int j = 0; j < 3; j++) {printf("%d ", (*arr)[j]); // 通過數組指針訪問數組元素}printf("\n");arr++; // 移動到下一行}
}int main() {int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; // 二維整型數組print_array(arr, 2); // 傳遞二維數組的行指針給函數return 0;
}

在上面的代碼中,我們定義了一個函數print_array,它接受一個數組指針和一個大小參數。這個函數可以用來打印任意大小的二維數組的行。在main函數中,我們傳遞了二維數組arr的行指針給print_array函數,并打印了數組的所有行。

2.3 數組指針的指針算術運算

數組指針的指針算術運算允許我們通過指針移動來訪問數組的元素。例如,如果我們有一個指向數組的指針ptr,我們可以通過ptr + i來獲取指向數組第i個元素的指針。

#include <stdio.h>int main() {int arr[3] = {1, 2, 3}; // 一個整型數組int (*ptr)[3] = &arr;   // 數組指針,指向整型數組arrfor (int i = 0; i < 3; i++) {printf("%d ", *(*ptr + i)); // 通過數組指針和指針算術運算訪問數組元素}return 0;
}

在上面的代碼中,我們使用了指針算術運算*ptr + i來訪問數組arr的元素。這種運算方式是數組指針的一種常見用法,尤其是在處理多維數組時。

總結

在本文的第二部分中,我們介紹了C語言中數組指針的基本概念、用途和指針算術運算。數組指針是一個指針,它指向一個數組,通常用于指向數組的第一個元素,并通過指針算術運算來訪問數組中的其他元素。數組指針在處理數組參數、多維數組以及指針算術運算中非常有用。在下一部分中,我們將探討指針數組和數組指針的結合使用,以及如何在實際編程中靈活運用這些技術。

第三部分:指針數組與數組指針的結合使用

3.1 指針數組與數組指針的區分

在C語言中,指針數組和數組指針雖然都涉及到指針和數組,但它們的概念和用途是不同的。指針數組是一個數組,其元素是指針;而數組指針是一個指針,它指向一個數組。理解這兩者之間的區別對于正確使用它們至關重要。

#include <stdio.h>int main() {int arr[3] = {1, 2, 3}; // 一個整型數組int *ptr[3];           // 指針數組,每個元素是一個整型指針int (*array_ptr)[3] = &arr; // 數組指針,指向一個整型數組// 初始化指針數組for (int i = 0; i < 3; i++) {ptr[i] = &arr[i];}printf("指針數組元素地址:\n");for (int i = 0; i < 3; i++) {printf("%p\n", ptr[i]);}printf("數組指針指向的數組首元素地址: %p\n", array_ptr);return 0;
}

在上面的代碼中,我們定義了一個整型數組arr,一個整型指針數組ptr,以及一個整型數組指針array_ptr。指針數組ptr的每個元素都指向arr數組中的一個元素,而數組指針array_ptr指向整個arr數組。

3.2 指針數組和數組指針的結合使用

在實際編程中,指針數組和數組指針可以結合使用,以實現復雜的數據結構和算法。例如,我們可以使用指針數組來存儲一組字符串,然后使用數組指針來訪問這些字符串。

#include <stdio.h>int main() {char *strings[] = {"apple", "banana", "cherry"}; // 指針數組,存儲字符串的地址char *(*array_ptr)[3] = &strings;               // 數組指針,指向指針數組printf("指針數組中的字符串:\n");for (int i = 0; i < 3; i++) {printf("%s\n", (*array_ptr)[i]); // 通過數組指針訪問指針數組的元素}return 0;
}

在上面的代碼中,我們定義了一個字符型指針數組strings,用于存儲字符串的地址。然后,我們定義了一個字符型數組指針array_ptr,它指向strings數組。通過數組指針,我們可以訪問指針數組中的字符串。

3.3 指針數組和數組指針在多維數組中的應用

在處理多維數組時,指針數組和數組指針尤為有用。我們可以使用指針數組來存儲每一行的地址,然后使用數組指針來訪問這些行。

#include <stdio.h>int main() {int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}}; // 二維整型數組int (*row_ptr)[3];                         // 數組指針,指向整型數組的行// 使用指針數組存儲每一行的地址int *ptr[2];for (int i = 0; i < 2; i++) {ptr[i] = matrix[i];}printf("二維數組的內容:\n");for (int i = 0; i < 2; i++) {row_ptr = (int (*)[3])ptr[i]; // 類型轉換,將整型指針轉換為數組指針for (int j = 0; j < 3; j++) {printf("%d ", (*row_ptr)[j]); // 通過數組指針訪問行中的元素}printf("\n");}return 0;
}

在上面的代碼中,我們定義了一個二維整型數組matrix和一個整型數組指針row_ptr。我們使用指針數組ptr來存儲每一行的地址,然后通過類型轉換將這些地址轉換為數組指針,以便訪問行中的元素。

總結

在本文的第三部分中,我們探討了指針數組和數組指針的結合使用。我們強調了指針數組和數組指針的區別,并展示了它們在存儲字符串、處理多維數組等場景中的應用。通過這些例子,我們可以看到指針數組和數組指針在C語言中提供了一種強大的方式來處理和訪問復雜的數據結構。正確地使用這些技術不僅可以提高代碼的效率,還可以增強代碼的靈活性和可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42901.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42901.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42901.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

matlab 卷積和多項式乘法

目錄 一、算法原理1、原理概述2、主要函數二、代碼實現1、通過卷積計算多項式乘法2、向量卷積3、卷積的中心部分三、參考鏈接一、算法原理 1、原理概述 兩個向量 u u u和 v v v的卷積,表示

大屏自適應容器組件 v-scale-screen

在vue中&#xff0c;v-scale-screen可用于大屏項目開發&#xff0c;實現屏幕自適應&#xff0c;可根據寬度自適應&#xff0c;高度自適應&#xff0c;和寬高等比例自適應&#xff0c;全屏自適應。 倉庫地址&#xff1a;github國內地址&#xff1a;gitee 一、安裝 npm instal…

qr 獲取當前路徑

qDebug() 函數在 Qt 應用程序中用于輸出調試信息。這些信息通常被發送到標準輸出&#xff08;stdout&#xff09;或標準錯誤&#xff08;stderr&#xff09;&#xff0c;具體取決于你的應用程序是如何配置的。在大多數開發環境中&#xff0c;你可以通過以下方式查看 qDebug() 輸…

React setState

老生常談之setState 是同步的還是異步的&#xff1f; 設想setState是同步的&#xff0c;那也就是每次調用setState都要進行新舊虛擬DOM的對比&#xff0c;然后將差異化的dom更新到頁面上&#xff0c;性能損耗很大 所以react把setState設置為了異步&#xff0c;當狀態更新時不…

【Unity2D 2022:Audio】添加游戲音樂和音效

一、添加背景音樂 1. 創建空的游戲物體&#xff0c;名為BackgroundMusic 2. 為音頻播放器添加音頻源&#xff08;Audio Source&#xff09;組件 3. 將背景音樂音頻賦值到AudioClip&#xff08;紅色&#xff09; 4. 設置循環播放&#xff08;藍色&#xff09; 二、添加草莓拾取…

springboot封裝請求參數json的源碼解析

源碼位置&#xff1a; org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver#readWithMessageConverters(org.springframework.http.HttpInputMessage, org.springframework.core.MethodParameter, java.lang.reflect.Type…

解答 | http和https的區別,誰更好用

TTP&#xff08;超文本傳輸協議&#xff09;和HTTPS&#xff08;安全超文本傳輸協議&#xff09;的主要區別在于安全性和數據傳輸的方式。 一、區別 1、協議安全性&#xff1a; HTTP&#xff1a;使用明文形式傳輸數據&#xff0c;不提供數據加密功能&#xff0c;數據在傳輸過…

coze搭建工作流和Agent

coze搭建工作流和Agent Agent LLM 記憶感知規劃使用工具 LLM是大語言模型&#xff0c;prompt提示詞影響LLM的輸出質量 描述需求——>背景——>解決思路&#xff0c;提示詞文檔。 當有明確的需求和實現需求的路徑時&#xff0c;可以通過搭建工作流來完成標準化任務為…

函數聲明與函數表達式的區別?

一、區別如下: 函數聲明的方法定義的函數,函數名是必須的,函數表達式的函數名是可選的。函數聲明的方法定義的函數,函數可以在函數聲明之前調用,函數表達式的函數只能在聲明之后調用。 函數聲明的方法定義的函數并不是真正的聲明,它們僅僅可以出現在全局中,或者嵌套在其他的函數…

Python爬蟲原理以及3個小案例(源碼)

一、爬蟲原理 網絡爬蟲是一種用于自動獲取網頁內容的程序。它模擬用戶瀏覽網頁的過程&#xff0c;通過發送HTTP請求獲取網頁的源代碼&#xff0c;并利用解析和提取技術來獲取所需的數據。 1. HTTP請求與響應過程 爬蟲向目標網站發送HTTP請求&#xff0c;請求包含URL、請求方…

Linux內核 -- DMA控制器之dmaengine框架的注冊與使用流程

Linux Kernel dmaengine 框架 簡介 Linux內核的dmaengine框架是一個用于管理DMA&#xff08;Direct Memory Access&#xff09;操作的通用框架。它抽象了不同DMA控制器的實現&#xff0c;使得上層代碼可以方便地進行DMA傳輸。 初始化流程 1. 驅動注冊 每個DMA控制器驅動都…

定義變量和聲明變量、定義類和聲明類

一、定義變量和聲明變量 在編程中&#xff0c;定義變量和聲明變量是兩個相關但不同的概念&#xff0c;尤其是在靜態類型的編程語言中。靜態類型的編程語言比如Java 1、聲明變量 &#xff08;1&#xff09;定義&#xff1a;聲明變量是指告訴編譯器變量的名字、類型和在某些情…

Mysql:時區問題

Mysql&#xff1a;時區問題 1、時區配置 Mysql默認使用系統的時區 mysql> show global variables like %time%zone%; -------------------------- | Variable_name | Value | -------------------------- | system_time_zone | | | time_zone | SYSTEM…

Multi-Wing Optimiser風扇選型軟件介紹

Multi-Wing Optimiser風扇選型軟件

一、YOLO V10安裝、使用、訓練大全

YOLO V10安裝、使用、訓練大全 一、下載官方源碼二、配置conda環境三、安裝YOLOV10依賴四、使用官方YOLO V10模型1.下載模型2.使用模型2.1 圖片案例 五、制作數據集1.數據集目錄結構2.標注工具2.1 安裝標注工具2.2 運行標注工具2.3 設置自動保存2.4 切換yolo模式2.5 開始標注2.…

Socket.D 開源網絡應用協議,v2.5.9 發布(已有 java, py, js SDK)

Socket.D 協議&#xff1f; Socket.D 是一個基于事件和語義消息流的網絡應用協議。在微服務、移動應用、物聯網等場景&#xff0c;可替代 http、websocket 等。協議詳情參考《官網介紹》。 支持&#xff1a; tcp, udp, ws, kcp 傳輸。 目前&#xff1a;java&#xff0c;kotli…

Python不使用元類的ORM實現

不使用元類的簡單ORM實現 在 Python 中&#xff0c;ORM&#xff08;Object-Relational Mapping&#xff09;是一種將對象和數據庫之間的映射關系進行轉換的技術&#xff0c;使得通過面向對象的方式來操作數據庫更加方便。通常&#xff0c;我們使用元類&#xff08;metaclass&a…

關于go和rust語言的對比

文章目錄 前言Rust 的優勢&#xff1a;Go 的優勢&#xff1a;總結 前言 Go 和 Rust 是兩種現代的系統級編程語言&#xff0c;它們各自擁有獨特的特性和應用場景。以下是它們的一些主要區別&#xff1a; Rust 的優勢&#xff1a; 內存安全&#xff1a;Rust 引入了所有權和借用…

香橙派5plus上跑云手機方案二 waydroid

前言 上篇文章香橙派5plus上跑云手機方案一 redroid(帶硬件加速)說了怎么跑帶GPU加速的redroid方案&#xff0c;這篇說下怎么在香橙派下使用Waydroid。 溫馨提示 雖然能運行&#xff0c;但是體驗下來只能用軟件加速&#xff0c;無法使用GPU加速&#xff0c;所有會很卡。而且…

Pat乙級題解

文章目錄 1~2021 ~ 4041~6061~8081~100101~125 1~20 1001 害死人不償命的(3n1)猜想 B1002 寫出這個數 (20 分) B1003 我要通過&#xff01; B1004 成績排名 1005 繼續(3n1)猜想 B1006 換個格式輸出整數 B1007 素數對猜想 1008 數組元素循環右移問題 B1009 說反話 1010 一元多項…