【C語言】第八期——指針

目錄

1 初始指針

2 獲取變量的地址

3?定義指針變量、取地址、取值

3.1 定義指針變量

3.2 取地址、取值

4 對指針變量進行讀寫操作

5 指針變量作為函數參數

6 數組與指針

6.1 指針元素指向數組

6.2?指針加減運算(了解)

6.2.1 指針加減具體數字?

6.2.2 指針加減指針

6.3?數組名與數組元素首地址的關系


1 初始指針

通過前面的教程我們知道變量是用來存儲數據的,變量的本質是給存儲數據的內存地址起了一個好記的別名

比如我們定義了一個變量 int a= 10 ,這個時候可以直接通過a這個變量來讀取內存中保存的10 這個值,在計算機底層a這個變量其實對應了一個內存地址

指針也是一個變量,但它是一種特殊的變量,它存儲的數據不是一個普通的值,而是另一個變量的內存地址

每一個變量都有一個內存位置,每一個內存位置都定義了可使用連字號(&)運算符訪問的地址,它表 示了在內存中的一個地址

剛開始學C語言的指針操作,我們只需要記住兩個符號 :&(取地址) 和 *(根據地址取值 /定義指針變量)


2 獲取變量的地址

每個變量在運行時都擁有一個地址,這個地址代表變量在內存中的位置。C語言中使用&字符放在變量 前面對變量進行取地址操作

#include <stdio.h>
int main(void)
{int a = 10;printf("a的地址是:%p\n", &a);return 0;
}

3?定義指針變量、取地址、取值

3.1 定義指針變量

指針是一個變量,其值為另一個變量的地址,即,內存位置的直接地址。就像其他變量或常量一樣,必須在使用指針存儲其他變量地址之前,對其進行聲明。指針變量聲明的一般形式為:

type *var-name;

在這里,type 是指針的基類型,它必須是一個有效的 C 數據類型,var-name 是指針變量的名稱。用 來聲明指針的星號 * 與乘法中使用的星號是相同的。但是,在這個語句中,星號是用來指定一個變量是 指針

以下是有效的指針聲明:

int* ip;    //一個整型的指針
double* dp; //一個 double 型的指針
float* fp;  //一個浮點型的指針
char* ch    //一個字符型的指針

所有指針的值都是一個地址,不管是整型、浮點型、字符型,還是其他的數據類型,都是一樣的,都是 一個代表內存地址的長的十六進制數。不同數據類型的指針之間唯一的不同是,指針所指向的變量或常量的數據類型不同


3.2 取地址、取值

#include <stdio.h>
int main(void)
{// 定義一個int變量aint a = 10;printf("a的地址是:%p\n", &a);// 定義int類型的指針變量pint* p_a = &a;printf("指針p_a的值:%p\n", p_a);printf("指針p_a的地址:%p\n", &p_a);printf("a的值:%d\n", a);printf("根據指針p_a的值去內存取值得到的結果為:%d", *p_a);return 0;
}

總結:

  • 取地址操作符&和取值操作符是一對互補操作符, & 取出地址, 根據地址取出地址指向的值
  • 對變量進行取地址(&)操作,可以獲得這個變量的地址
  • 指針變量的值是地址
  • 對指針變量進行取值(*)操作,可以獲得指針變量指向的原變量的值

4 對指針變量進行讀寫操作

#include <stdio.h>
int main(void)
{int a = 10;int b = 20;int* p1, * p2; // 定義指針變量 p1、 p2p1 = &a;// p1 指向變量 ap2 = p1;// p2 指向變量 aprintf("&a=%p p1=%p p2=%p\n", &a, p1, p2);*p1 = 20;printf("a的值%d,取指針得到的值%d", a, *p1);return 0;
}

運行結果:

&a=000000612A17FA74 p1=000000612A17FA74 p2=000000612A17FA74
a的值20,取指針得到的值20


5 指針變量作為函數參數

在C語言中,函數參數不僅可以是字符型、整型、浮點型等,還可以是指針類型,作用是將變量地址傳遞給函數形參

#include <stdio.h> 
void modify1(int *c) 
{*c = 20;
}
int main(void) {int a = 10;modify1(&a);printf("%d", a);return 0;
}

6 數組與指針

6.1 指針元素指向數組

數組本質上是一片連續的內存空間,每個數組元素都對應一塊獨立的內存空間,它們都有相應的地址。

因此,指針變量既然可以指向變量,也就可以指向數組元素

數組的元素本質上完全可以當做是單獨的變量對待,只不過沒有名稱而已

int a[5]={1,2,3,4,5}; //定義長度為5的int數組
int *p_a=&a[0]; //定義指向int變量的指針變量p_a,把a數組第0個元素地址賦給指針變量p_a

注意:&a[0]等價于&(a[0]),由于[ ]運算符比取地址運算符&優先級高,因此&(a[0])中的小括號可以省略,簡寫為:&a[0]

在計算機中內存的最小單位是字節,每個字節都對應一個地址

如果一個變量占用多個字節,就會占用 多個內存地址

例如: char 類型變量占1字節就對應1個地址,short 類型變量占2字節對應2個地址,int 類型變量占4 字節對應4個地址.....·其他類型依次類推

同理,數組元素類型不同占用的內存地址也不同

下面通過例子來驗證以上分析

#include<stdio.h>
int main(void)
{char c[5];short s[5];int i;for (i = 0; i < 5; i++){printf("&c[%d]=%p ", i, &c[i]);printf("&s[%d]=%p \n", i, &s[i]);}return 0;
}

運行結果:

&c[0]=000000000061FE17 &s[0]=000000000061FE0C

&c[1]=000000000061FE18 &s[1]=000000000061FE0E

&c[2]=000000000061FE19 &s[2]=000000000061FE10

&c[3]=000000000061FE1A &s[3]=000000000061FE12

&c[4]=000000000061FE1B &s[4]=000000000061FE14

說明:不同設備上面輸出的地址可能不一樣的,數組中每個元素地址都是連續的


6.2?指針加減運算(了解)

6.2.1 指針加減具體數字?

指針本質上就是內存地址,在32 位操作系統下,內存地址是 4 字節的整數。既然是整數就可以進行 加、減、乘、除等算術運算。不過需要注意的是,在 C 語言中一般只討論指針加、減運算,乘、除等其 他算術運算都沒有意義

在實際開發中,指針加、減運算多用于數組(或連續內存空間)。當指針變量p 指向數組元素時,p+1 表 示指向下一個數組元素,p-1 表示指向上一個數組元素

#include <stdio.h>
int main(void)
{int a[3] = { 1, 2, 3 };int* p = &a[0];// 指針 p 指向 a[0]printf("%p %d\n", p, *p); // 輸出 a[0] 的地址 和 a[0] 的值p = p + 1;// p 加 1printf("%p %d\n", p, *p); // 輸出 a[1] 的地址 和 a[1] 的值return 0;
}

運行結果:

000000811557F968 1
000000811557F96C 2

注意:實現指針加減的時候需要注意越界問題


6.2.2 指針加減指針

在C語言中,兩個指針相加是沒有意義的,而兩個指針相減卻有特殊的意義,不過只有當兩個指針都指向同一數組中的元素時才有意義

一個數組中的元素時,對它們進行減法運算,得到的結果是這兩個指針所指向元素之間相隔的元素個數 (不是之間有的個數,之間有的元素數要在此基礎上減一),而不是它們地址差值的字節數。其計算方式是用兩個指針的地址差值除以指針所指向數據類型的大小

用公式表示為:(指針2的地址 - 指針1的地址) / sizeof(指針所指向的數據類型)


6.3?數組名與數組元素首地址的關系

C語言中,數組名與數組首元素地址等價。也就是說,在程序中,輸出數組名與輸出數組首元素地址是相同的

#include <stdio.h>
int main(void)
{int num[5];printf("%p\n", num);     // 輸出數組名printf("%p\n", &num[0]); // 輸出數組首元素地址return 0;
}

輸出結果:

000000000061FE00

000000000061FE00

我們就可以通過把數組名復制給指針變量,來把數組首地址給指針變量

#include <stdio.h>int main(void){int num[5] = {1, 2, 3, 4, 5};int *p_num = num; // 把num的首地址賦值給指針變量printf("p_num指針的值=%p \n p_num對應數組元素的值%d", p_num, *p_num);return 0;}

我們也可以通過p_num來訪問數組里面的每個元素

 #include <stdio.h>int main(void){int num[5] = {1, 2, 3, 4, 5};int *p_num = num; // 把num的首地址賦值給指針變量printf("p_num指針的值=%p ,num的地址是=%p  p_num對應數組元素的值%d\n", p_num, num, 
*p_num);printf("p_num訪問第一個元素=%d\n", p_num[0]);printf("p_num訪問第二個元素=%d\n", p_num[1]);return 0;}

運行結果:

p_num指針的值=000000000061FE00 ,num的地址是=000000000061FE00 ?p_num對應數組元素的值1

p_num訪問第一個元素=1 p_num訪問第二個元素=2

持續更新中...

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

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

相關文章

為 Power Automate 注冊 Adobe PDF Services

前言 最近&#xff0c;再測試如何將HTML轉換成PDF&#xff0c;然后發現Adobe有一個免費的操作可以用&#xff0c;好開心&#xff0c;趕緊注冊一下。 正文 1.先注冊一個賬號&#xff0c;然后登錄到Adobe Developer 注冊鏈接&#xff1a;https://www.adobe.com/go/getstarted_pow…

BY組態:工業自動化的未來,觸手可及

1. BY組態軟件的核心優勢 簡單易用&#xff1a;圖形化界面&#xff0c;降低學習成本&#xff0c;快速上手。 高效靈活&#xff1a;支持多種設備協議&#xff0c;兼容性強&#xff0c;適用于多種行業。 實時監控&#xff1a;提供實時數據采集與可視化&#xff0c;助力高效決策…

有哪些開源大數據處理項目使用了大模型

以下是一些使用了大模型的開源大數據處理項目&#xff1a; 1. **RedPajama**&#xff1a;這是一個開源項目&#xff0c;使用了LLM大語言模型數據處理組件&#xff0c;對GitHub代碼數據進行清洗和處理。具體流程包括數據清洗、過濾低質量樣本、識別和刪除重復樣本等步驟。 2. …

網絡安全之攻防筆記--通用安全漏洞SQL注入sqlmapOraclemongodbDB2

通用安全漏洞SQL注入&sqlmap&Oracle&mongodb&DB2 數據庫類型 ACCESS 特性 沒數據庫用戶 沒數據庫權限 沒數據庫查詢參數 沒有高權限注入說法 暴力猜解&#xff0c;借助字典得到數據 注入方式 聯合注入 偏移注入 表名列名猜解不到 偏移注入 MySQL 低權限 常…

【信息系統項目管理師-案例真題】2022下半年案例分析答案和詳解

更多內容請見: 備考信息系統項目管理師-專欄介紹和目錄 文章目錄 試題一(24分)【問題1】(6分)【問題2】(10分)【問題3】(8分)試題二(26分)【問題1】(8分)【問題2】(8分)【問題3】(4分)【問題4】(6分)試題三(25分)【問題1】(12分)【問題2】(7分)【問題…

正點原子[第三期]Arm(iMX6U)Linux系統移植和根文件系統構建-5.3 xxx_defconfig過程

前言&#xff1a; 本文是根據嗶哩嗶哩網站上“arm(iMX6U)Linux系統移植和根文件系統構鍵篇”視頻的學習筆記&#xff0c;在這里會記錄下正點原子 I.MX6ULL 開發板的配套視頻教程所作的實驗和學習筆記內容。本文大量引用了正點原子教學視頻和鏈接中的內容。 引用&#xff1a; …

C++初階——簡單實現list

目錄 1、前言 2、List.h 3、Test.cpp 1、前言 1. 簡單實現std::list&#xff0c;重點&#xff1a;迭代器&#xff0c;模板類&#xff0c;運算符重載。 2. 并不是&#xff0c;所有的類&#xff0c;都需要深拷貝&#xff0c;像迭代器類模板&#xff0c;只是用別的類的資源&am…

conda環境中運行“python --version“所得的版本與環境中的python版本不一致----deepseek并非全能

conda環境中運行python —version所得python版本與conda環境中的python版本不一致------deepseek并非全能 問題 conda環境中運行python —version所得python版本與conda環境中的python版本不一致 我所做的探索 1 網頁搜索 2 求助于DeepSeek 可以用四個字來形容deepseek給出…

HarmonyOS學習第5天: Hello World的誕生之旅

鴻蒙初印象&#xff1a;開啟探索之門 在操作系統的廣袤天地中&#xff0c;HarmonyOS&#xff08;鴻蒙系統&#xff09;宛如一顆冉冉升起的新星&#xff0c;自誕生起便備受矚目。它由華為傾力打造&#xff0c;是一款基于微內核的全場景分布式操作系統&#xff0c;以其獨特的技術…

centos9安裝k8s集群

以下是基于CentOS Stream 9的Kubernetes 1.28.2完整安裝流程&#xff08;containerd版&#xff09;&#xff1a; 一、系統初始化&#xff08;所有節點執行&#xff09; # 關閉防火墻 systemctl disable --now firewalld# 關閉SELinux sed -i "s/SELINUXenforcing/SELINU…

CIG容器重量級監控系統

1.介紹 CAdvisorinfluxDBGranfana docker 原生命令 監控docker容器狀態 docker stats 2.CAdvicsor 3.InfluxDB 4.Granafana 5.搭建 volumes:grafana_data: services:influxdb:image: tutum/influxdbrestart: alwaysenvironment:- PRE_CREATE_DBcadvisorports:- "8083…

REACT學習DAY02(恨連接不上服務器)

受控表單綁定 概念&#xff1a;使用React組件的狀態&#xff08;useState&#xff09;控制表單的狀態 1. 準備一個React狀態值 const [value,setValue] useState() 2. 通過value屬性綁定狀態&#xff0c;通過onChange屬性綁定狀態同步的函數 <input type"text&quo…

python——GUI圖形用戶界面編程

GUI簡介 我們前面實現的都是基于控制臺的程序&#xff0c;程序和用戶的交互通過控制臺來完成 本章&#xff0c;我們來學習GUI圖形用戶界面編程&#xff0c;我們可以通過python提供的豐富的組件&#xff0c;快速的視線使用圖形界面和用戶交互 GUI變成類似于“搭積木”&#x…

DeepSeek 助力 Vue 開發:打造絲滑的單選按鈕(Radio Button)

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

美顏相機1.0

項目開發步驟 1 界面開發 美顏相機界面構成&#xff1a; 標題 尺寸 關閉方式 位置 可視化 2 創建主函數調用界面方法 3 添加兩個面板 一個是按鈕面板一個是圖片面板 用JPanel 4 添加按鈕到按鈕面吧【注意&#xff1a;此時要用初始化按鈕面板的方法initBtnPanel 并且將按鈕添…

openharmony中hdf框架的驅動消息機制的實現原理

openharmony中hdf框架的驅動消息機制的實現原理 在分析hdf框架時發現繞來繞去的&#xff0c;整體梳理畫了一遍流程圖&#xff0c;發現還是有點模糊甚至不清楚如何使用的&#xff0c;詳細的每個點都去剖析細節又過于消耗時間&#xff0c;所以有時間便從功能應用的角度一塊塊的去…

leaflet實現歷史軌跡播放效果

效果圖如下&#xff1a; 效果實現&#xff1a; 1、添加完整軌跡線&#xff0c;藍色的 this.echoLine L.polyline(points, { weight: 8 }).addTo(this.map) 2、添加實時軌跡線&#xff0c;初始狀態置空 this.realEchoLine L.polyline([], { weight: 12, color: "#FF9…

JAVAEE一>Spring IoC和DI詳解

目錄 Spring容器說明&#xff1a;Ioc容器優勢&#xff1a;DI介紹&#xff1a;從Spring獲取對象&#xff1a;獲取對象的方法&#xff1a;關于上下文的概念&#xff1a; Controller注解&#xff08;控制層&#xff1a;接收參數并響應&#xff09;&#xff1a;Service注解&#xf…

(四)趣學設計模式 之 原型模式!

目錄 一、 啥是原型模式&#xff1f;二、 為什么要用原型模式&#xff1f;三、 原型模式怎么實現&#xff1f;四、 原型模式的應用場景五、 原型模式的優點和缺點六、 總結 &#x1f31f;我的其他文章也講解的比較有趣&#x1f601;&#xff0c;如果喜歡博主的講解方式&#xf…

完美解決:.vmx 配置文件是由 VMware 產品創建,但該產品與此版 VMware Workstation 不兼容

參考文章&#xff1a;該產品與此版 VMware Workstation 不兼容&#xff0c;因此無法使用 問題描述 當嘗試使用 VMware Workstation 打開別人的虛擬機時&#xff0c;可能會遇到以下報錯&#xff1a; 此問題常見于以下場景&#xff1a; 從其他 VMware 版本&#xff08;如 ESX…