C語言-指針[指針數組和數組指針]

知識重復

  • 變量指針:變量最小的地址值(首地址),本質是地址、指針

  • 指針變量:存儲指針的變量,本質是變量

  • &:取地址運算符(取址符、取地址符),獲取變量、數組等的地址

  • *:指針操作符,如果這個符號前面有數據類型,就被稱為“指針聲明符”,如果沒有數據類型,就被稱為“解引用符”

  • 指向:指針變量存儲了誰的地址,這個指針變量就指向了誰

  • 交換指向:指向發生改變,指向對象的數據不會改變

  • 交換數據:指向不發生改變,指向對象的數據會改變

  • 指針變量本質上還是變量,只不過指針變量只能存儲其他內存單元的地址,我們借助于指針變量,就能實現內存空間的共享

  • 共享他人空間:

    int a = 10;
    int *p = &a;
    int *q = p;
    
  • 共享自己的空間:

    int a  = 10;
    int *p = &a;  //a和p共享a的空間
    

指針數組和數組指針

數組指針

定義
  • 概念:數組指針是指向數組的指針(指針變量),本質上還是指針

指針變量指向數組元素和數組指針的區別:
在這里插入圖片描述

特點

  • ①先有數組,再有指針
  • ②它指向的是一個完整的數組

一維數組指針

語法

數據類型 (*指針變量名)[容量];

案例

在這里插入圖片描述

我們之前所學的是指向數組元素的指針,本質上是指針變量;現在我們學的是指向數組的指針,叫做數組指針

二維數組指針

語法:

數據類型 (*指針變量名)[行容量][列容量];

案例1

//寫法1:二維數組指針指向二維數組----不推薦
#include <stdio.h>
int main()
{//創建一個二維數組int arr[][3] = {10,20,30,100,200,300,1000,2000,3000};//定義一個二維數組指針指向二維數組int (*p)[][3] = &arr;//遍歷數組for(int i = 0;i < 3; i++){for(int j = 0;j < 3; j++){printf("%-6d",(*p)[i][j]);}}printf("\n");//寫法2:一維數組指針指向二維數組-----推薦//創建一個二維數組int arr[][3] = {10,20,30,100,200,300,1000,2000,3000};    //定義一個一維數組指針指向二維數組,相當于指針指向的是二維數組的行[行容量]int (*p)[3] = arr;//等價于&arr[0] (*p):指向數組的行   int arr[] = {100,200,300};  int *p = arr;  解引用p得到第一個元素//遍歷數組for(int i = 0;i < 3; i++){for(int j = 0;j < 3; j++){printf("%-6d",(*p)[i][j]);}}printf("\n");    return 0;
}

案例2

/*
**指向一維數組的指針
*/#include <stdio.h>int t_pl()
{//創建一個一維數組int arr[] = {10,20,30,40,50};//計算數組大小int len = sizeof(arr) / sizeof(arr[0]);//創建一個數組指針指向一維數組arrint (*p)[len] = &arr;//借助數組指針遍歷數組for(int i = 0; i < len; i++){//p 指向數組arr,p存儲了數組arr的地址,如果要通過指針訪問數組,就要對地址解引用(*p), *和[]在一起,[]的優先級大于*printf("%-4d", (*p)[i]);}printf("\n");
}/*
**指向二維數組的指針
*/int t_p2()
{//創建一個二維數組int arr[][3] = {{10,20,30},{100,2200,300},{1000,2000,3000}};//獲取行和列的容量int row_len = sizeof(arr) / sizeof(arr[0]);int col_len = sizeof(arr[0]) / sizeof(arr[0][0]);//方式1(不推薦)  二維數組指針指向二維數組int (*p)[][3] = &arr;//遍歷數組for(int i = 0;i < row_len; i++){for(int j = 0; j < col_len; j++){printf("%-6d", (*p)[i][j]);   } }printf("\n");//方式2(推薦)  一維數組指針指向二維數組,本質上是一維數組指針指向二維數組的行(默認首行)//&arr:獲取該二維數組的地址,范圍作用于整個數組//arr:數組名,默認指向第一個元素,這個就是行,默認首行,范圍作用于整個行,等價于&arr[0]//數組參與指針運算,會降級為指針int (*p1)[3] = &arr[0];for(int i = 0; i < row_len;i++){for(int j = 0; j < col_len; j++){printf("%-6d", p1[i][j]);printf("%-6d", (*(p1+i))[j]);printf("%-6d", *(p1[i]+j));//列偏移printf("%-6d", *(*(p1+i)+j));}}printf("\n");    
}int main()
{return 0;
}

數組指針和指針數組

數組指針

指針和數組中符號優先級
() > [] > *
通過指針引用二維數組
int arr[][] = {{2000},{},{}};
表示形式含義地址/值
arr二維數組名,指向一維數組的arr[0],0行首地址2000
arr[0],*****(arr + 0),*arr0行0列元素地址,數組降級指針2000
arr + 1,&arr[1]1行首地址2008
arr[1],*(arr + 1)1行0列元素a[1] [0]的地址2008
arr[1]+2,*(arr + 1)+2,&arr[1] [2]1行2列元素a[1] [2]的地址2012
* (a[1]+2), * (* (arr+1)+2),arr[1] [2]1行2列元素a[1] [2]的值元素值為13

注意:二維數組中,數組整體的地址值 == 數組中0行元素的地址值 == 數組中0行0列元素的地址值

在這里插入圖片描述

案例1
  • 用指向元素的指針變量輸出二維數組元素的值

    #include <stdio.h>int mian()
    {//定義一個二維數組int arr[3][4] = {10,20,30,40,100,200,300,400,1000,2000,3000,4000};//定義一個指針變量,用來指向數組中的元素int *p = arr[0];//獲取元素個數  行容量 * 列容量int len = (sizeof(arr) /sizeof(arr[0])) * (sizeof(arr[0]) / sizeof(arr[0][0]));//使用單層for循環遍歷二維數組,列偏移for(; p < arr[0] + len; p++){//每四個一行  if((p - arr[0]) % 4 == 0 && p != arr[0])printf("\n"); printf("%-6d", *p); }printf("\n");return 0;
    }
    
案例2
  • 數組指針輸出二維數組任意行任意列的元素的值

    在這里插入圖片描述

指針數組

  • 定義:指針數組是一個數組,數組中每一個元素都是一個指針。

  • 特點:

    • 先有指針,后有數組
    • 指針數組的本質是一個數組,只是數組中的每一個元素是指針
  • 語法:

    數據類型 *數組名[容量];
    
案例
#include <stdio.h>int main()
{//定義三個變量int a = 10, b = 20, c = 30;//定義指針數組:先有指針,后有數組、int *arr[3] = {&a, &b, &c};//獲取大小int len = sizeof(arr) / sizeof(arr[0]);//遍歷數組for(int i = 0; i < len; i++){printf("%-3d", *arr[i]);  }printf("\n");return 0;
}
  • 建議:我們一般使用指針數組處理字符串,后續專門講解
數組指針與指針數組的區別
對比項指針數組數組指針
定義數組元素均為指針的數組指向一個完整數組的指針
存儲內容存儲多個指針,每個元素指向不同的內存地址存儲單個指針,指向一個完整的數組(首地址)
內存分配每個指針元素獨立分配內存,可能分散指向的數組內存連續的,指針本身存儲數組首地址
語法實例int *arr[5] 元素為5個int *指針int (*arr) [5] 指向5個int的數組的指針
訪問方式通過下標訪問指針元素,再解引用 *arr[i]先解引用指針得到數組,再訪問元素 (*arr) [i]
使用場景管理多個獨立指針(如字符串數組、動態結構體數組)操作多維數組(如傳遞二維數組的行指針)
內存布局[ptr1] --> 數據1 [ptr2] --> 數據2 …ptr --> [數據1] [數據2]…
示例代碼int a = 1,b = 2;int *arr[] = {&a,&b};int arr[2] [3] = {1,2,3,4,5,6};int (*ptr)[3] = arr;

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

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

相關文章

NX982NX984美光固態閃存NX992NY102

NX982NX984美光固態閃存NX992NY102技術革新引領存儲革命——深度拆解美光NX系列固態閃存在數字化浪潮席卷全球的當下&#xff0c;數據存儲已成為支撐人工智能、云計算與物聯網等前沿領域的核心基礎設施。作為行業標桿企業&#xff0c;美光科技推出的NX系列固態閃存產品&#xf…

Elasticsearch 集群管理核心 API 指南:健康、狀態、分片診斷與運維實戰

一、集群健康狀態 API (_cluster/health) 獲取集群的總體健康狀況&#xff0c;是監控的首要指標。 GET http://192.168.130.61:9200/_cluster/health響應字段解析 curl http://192.168.130.61:9200/_cluster/health 2>/dev/null |jq {"cluster_name": "E…

Three.js 與 WebXR:初識 VR/AR 開發

引言 WebXR 是現代 Web 技術的重要組成部分&#xff0c;允許開發者通過瀏覽器創建虛擬現實&#xff08;VR&#xff09;和增強現實&#xff08;AR&#xff09;體驗。結合 Three.js 的強大渲染能力&#xff0c;WebXR 可以輕松構建沉浸式 3D 場景。本文將介紹如何使用 Three.js 和…

Kubernetes架構概覽

目錄 專欄介紹 作者與平臺 您將學到什么&#xff1f; 學習特色 Kubernetes架構概覽 1.1 Kubernetes簡介 1.2 基本架構 1.3 主要組件 1.4 核心功能 組件架構圖解 2.1 控制平面組件詳解 2.1.1 kube-apiserver 2.1.2 etcd 2.1.3 kube-scheduler 2.1.4 kube-controll…

前端技術棧查缺補漏

前端技術棧涵蓋廣泛&#xff0c;涉及多個領域和技術方向。以下是全面的分類總結&#xff0c;幫助你對前端技術生態有系統化的了解&#xff1a;一、核心基礎HTML/CSS HTML5&#xff08;語義化標簽、Web Components&#xff09;CSS3&#xff08;Flexbox/Grid、動畫、變量、BEM/SM…

文明7|席德·梅爾的文明VII PC/手機雙端 模擬器版(Sid Meier’s Civilization VII)免安裝中文版

網盤鏈接&#xff1a; 文明7|席德梅爾的文明VII 免安裝中文版 名稱&#xff1a;文明7|席德梅爾的文明VII PC/手機雙端 模擬器版 免安裝中文版 描述&#xff1a;這款策略神作重新定義了"歷史蝴蝶效應"&#xff01; 《文明7》的"文明基因"系統讓每個選擇都刻…

C#模式匹配用法與總結

1. 模式匹配概述?? 模式匹配是C# 7.0引入的機制&#xff0c;用于檢查數據的類型、值或結構&#xff0c;并提取信息。通過is表達式、switch語句/表達式實現&#xff0c;顯著簡化條件邏輯&#xff0c;提升代碼可讀性和安全性。 ??核心優勢??&#xff1a; ??簡潔性??&…

修改git commit 提交版本的描述信息

1 修改最后一次提交&#xff08;未推送到遠程倉庫&#xff09; 適用場景&#xff1a;提交僅存在于本地&#xff0c;尚未執行 git push 操作步驟&#xff1a;git commit --amend -m "新的正確備注"原理&#xff1a;–amend 會合并新的修改到上一次提交&#xff0c;并允…

PyQt GUI開發初學者:固定尺寸還是全屏自適應?

PyQt GUI開發初學者&#xff1a;固定尺寸還是全屏自適應&#xff1f;在PyQt GUI開發中&#xff0c;新手常常面臨一個選擇&#xff1a;是應該為應用程序設置固定尺寸&#xff0c;還是采用全屏自適應設計&#xff1f;這個決定不僅關乎用戶體驗&#xff0c;還影響開發效率和應用的…

量子圖靈機 Quantum Turing Machine, QTM

量子圖靈機&#xff08;Quantum Turing Machine, QTM&#xff09;是經典圖靈機&#xff08;Turing Machine, TM&#xff09;在量子計算框架下的推廣&#xff0c;它利用量子力學原理&#xff08;如疊加態、糾纏和幺正演化&#xff09;擴展了計算能力。下面對量子圖靈機進行解析。…

用于 UBI 的 Elasticsearch 插件:從搜索查詢中分析用戶行為

作者&#xff1a;來自 Elastic Eduard Martin 想獲得 Elastic 認證&#xff1f;了解下一期 Elasticsearch Engineer 培訓的時間&#xff01; Elasticsearch 擁有豐富的新功能&#xff0c;幫助你為你的使用場景構建最佳搜索解決方案。深入查看我們的示例筆記本以了解更多信息&a…

python的蛋糕店管理系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具&#xff1a;Navicat/SQLyog等都可以 該系統通…

開源項目:排序算法的多種實現方式

以 排序算法 為例&#xff0c;展示如何在 Python 中進行不同實現方式的對比項目概述本項目旨在通過 Python 實現幾種經典的排序算法&#xff0c;并通過性能對比、代碼注釋和優化手段&#xff0c;為開源社區提供參考。選擇排序、冒泡排序、快速排序和歸并排序作為主要算法&#…

操作系統數據格式相關(AI回答)

二進制接口&#xff08;ABI&#xff09; DeepSeek-R1 回答完成 深度思考完成 用時20秒&#xff0c;搜索全網24篇資料 二進制接口&#xff08;ABI&#xff0c;Application Binary Interface&#xff09;是計算機系統中定義二進制層面交互規則的低層接口規范&#xff0c;確保不…

從入倉到結算全自動化:易境通如何重構散貨拼柜業務流程?

在全球貿易蓬勃發展的今天&#xff0c;海運拼箱&#xff08;LCL&#xff09;憑借成本低、靈活性強的優勢&#xff0c;成為中小貨主、跨境電商和國際貿易企業的首選物流方式。然而&#xff0c;散貨拼柜業務涉及多貨主、多環節、多流程&#xff0c;傳統管理方式存在信息不透明、效…

CAP 理論筆記

一、CAP 理論概述 CAP 理論由 Eric Brewer 于 2000 年提出&#xff0c;并在 2002 年被正式證明。它描述了分布式系統在 一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;、分區容忍性&#xff08;Partition Tolerance&#xff09; 三個…

Android 底層實現基礎

Activity 生命周期應用內 Activity 跳轉流程&#xff08;A → B&#xff09; 從 Activity A 打開新的 Activity B&#xff08;如點擊按鈕跳轉詳情頁&#xff09; A.onCreate() → A.onStart() → A.onResume() &#xff08;A 已在前臺&#xff09;點擊跳轉按鈕 → A.onPause() …

MySQL進階:(第一篇) 深入解析MySQL存儲引擎架構

一、MySQL的體系結構連接層&#xff1a;最上層是一些客戶端和鏈接服務&#xff0c;主要完成一些類似于連接處理、授權認證、及相關的安全方案。服務器也會為安全接入的每個客戶端驗證它所具有的操作權限。服務層&#xff1a;第二層架構主要完成大多數的核心服務功能&#xff0c…

京東m端 滑塊 分析 t30

聲明: 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01;部分python代碼response requests.pos…

CentOS使用命令行工具為其配置靜態網絡并使用VMware軟件ovf配置文件快速配置多臺不同ip的centos文件

目錄 一、實驗前準備 1.SSH遠程登錄工具 二、CentOS配置靜態IP并實現遠程ssh登錄 1.VMware軟件查看NAT模式下默認網段和網關 2.使用ipconfig查看當前網卡名字和動態分配的ip地址 3.使用VIM編輯網絡配置文件&#xff08;此步驟可有其他編輯器替代&#xff0c;例如&#xf…