C語言-初探指針

初探指針

  • 指針概念
  • 指針和指針類型
    • 指針類型意義
  • 野指針
    • 如何避免
  • 指針運算
    • 指針+-整數
    • 指針-指針
    • 指針的關系運算
  • 指針和數組
  • 二級指針
  • 指針數組

指針概念

  1. 指針是內存中一個最小單元(1個字節)的編號,也就是地址
  2. 平時口語中說的指針,通常指的是指針變量,是用來存放內存地址的變量

int a = 10; //在內存中開辟空間,a是整型變量,占用4個字節的內存空間
int* p = &a; //使用&操作符,取出a的第一個內存單元地址,存放在指針變量pa中,pa的類型是int*

在32位的機器上,地址是32個0或者1組成二進制序列,那地址就得用4個字節的空間來存儲,所以
一個指針變量的大小就應該是4個字節
那如果在64位機器上,如果有64個地址線,那一個指針變量的大小是8個字節,才能存放一個地址
總結:
指針變量是用來存放地址的,地址是唯一標示一塊地址空間的
指針的大小在32位平臺是4個字節,在64位平臺是8個字節

指針和指針類型

指針的類型:char*、short*、int*、long*、……

指針類型意義

指針類型的意義1:
指針類型決定了指針在被解引用的時候訪問幾個字節
如果是int*的指針,解引用訪問4個字節,如果是char*的指針,解引用訪問1個字節

在這里插入圖片描述

在這里插入圖片描述

指針類型的意義2:
指針類型決定了指針±操作的時候,跳過幾個字節,決定了指針的步長

在這里插入圖片描述
010FFE20 - 010FFE1C = 0x04
0減C,向高位借1,因為是16進制,所以就是16+0=16,16-12?=0x04,就是10進制的4

野指針

概念:野指針就是指針指向的位置是不可知的(隨機的、不正確的、沒有明確限制的)

如何避免

  1. 指針初始化
  2. 小心指針越界
  3. 指針指向空間釋放即使置NULL
  4. 避免返回局部變量的地址
  5. 指針使用之前檢查有效性

指針運算

指針±整數

#define N_VALUES 5
float values[N_VALUES];
float *vp;
//指針+-整數;指針的關系運算
for (vp = &values[0]; vp < &values[N_VALUES];)
{
*vp++ = 0;
}

*vp++*vp然后vp++雖然后置++的優先級高,但是后置++是先使用,后++
(vp)++是vp指向的內容++

指針-指針

指針-指針得到的是指針和指針之間的元素的個數
不是所有的指針都能相減,指向同一塊空間的2個指針才能相減

指針的關系運算

for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
{
*vp = 0;
}

實際在絕大部分的編譯器上是可以順利完成任務的,然而我們還是應該避免這樣寫,因為標準并不保證
它可行。
但是標準規定:
允許指向數組元素的指針與指向數組最后一個元素后面的那個內存位置的指針比較,但是不允許與
指向第一個元素之前的那個內存位置的指針進行比較。

指針和數組

數組名代表首元素的地址,除了
1.sizeof(數組名),計算整個數組的大小,sizeof內部單獨放一個數組名,數組名表示整個數組
2.&數組名,取出的是數組的地址,&數組名,數組名表示整個數組
在這里插入圖片描述

二級指針

指針變量也是變量,是變量就有地址,那指針變量的地址存放在二級指針中
在這里插入圖片描述
對ppa解引用*ppa得到的是pa的值,再解引用**ppa得到的是a的值

指針數組

是數組,是存放指針的數組,存放的類型是int*

#include <stdio.h>int main()
{int a = 1;int b = 2;int c = 3;int* pa = &a;int* pb = &b;int* pc = &c;int* parr[10] = { &a, &b, &c };int i = 0;for (i = 0; i < 3; i++){printf("%d ", *(parr[i]));//1 2 3}return 0;
}

模擬出二維數組

#include <stdio.h>int main()
{int arr1[4] = { 1, 1, 1, 1 };int arr2[4] = { 2, 2, 2, 2 };int arr3[4] = { 3, 3, 3, 3 };int* parr[4] = { arr1, arr2, arr3 };int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){//printf("%d ", *(parr[i] + j));printf("%d ", parr[i][j]);}printf("\n");}return 0;
}

*(parr[i] + j) 和 parr[i][j]是等價的

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

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

相關文章

(免費領源碼)java#springboot#mysql校園醫院預約掛號系統32236-計算機畢業設計項目選題推薦

摘 要 信息化社會內需要與之針對性的信息獲取途徑&#xff0c;但是途徑的擴展基本上為人們所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人們經常能夠獲得不同類型信息&#xff0c;這也是技術最為難以攻克的課題。針對校園醫院管理等問題&#xff0c;對校園醫院…

初識單片機

單片機 英文 Micro Controller Unit&#xff08;MCU&#xff09; 1.內部集成了CPU、RAM、ROM、定時器、中斷系統、通訊接口等一系列電腦的常用硬件功能 2.單片機的任務是信息采集&#xff08;依靠傳感器&#xff09;、處理&#xff08;依靠CPU&#xff09;和硬件設備&#…

【嵌入式單片機】之RS-232、RS-485、RS-422比較

1. RS422是什么 RS422,正式名稱為TIA/EIA-422,是一種串行通信標準,專為實現長距離、高可靠性的數據傳輸而設計。它采用差分信號傳輸技術,通過兩對雙絞線實現全雙工通信,即發送和接收可以同時進行。RS422在工業自動化和遠程監控系統中曾經扮演著重要角色,以其出色的抗干擾…

MySQL—常用的數據類型

數據類型 整型 1.創建一個含有無符號/有符號整型的字段的表 CREATE TABLE L1(id tinyint unsigned #無符號 ) CREATE TABLE L2(id tinyint #默認為有符號 ) 數值型(bit) 2.數值型(bit)的使用 小數 3.數值型(小數)的基本使用 字符串 4.字符串的基本使用 #演示字符串類型…

MySQL中的左連接詳解

在 MySQL 中&#xff0c;左連接&#xff08;LEFT JOIN&#xff09;也稱為左外連接&#xff0c;是一種用于連接兩個或多個表的操作。 左連接的結果包含左表&#xff08;即 LEFT JOIN 關鍵字左邊的表&#xff09;中的所有行&#xff0c;即使在右表&#xff08;即 LEFT JOIN 關鍵…

【學習筆記】網絡設備(華為交換機)基礎知識1——命令行入門知識

一、前期準備 提示&#xff1a;下面所有學習內容都是基于以下條件完成的 條件1.已經可以正常訪問交換機的命令行接口 連接到命令行接口的方法 &#xff1a; ① &#xff1a;通過Console口本地訪問 ② &#xff1a; 通過Telnet訪問 ③ &#xff1a; 通過SSH訪問 ④ &#xff1…

小阿軒yx-LVS負載均衡群集

小阿軒yx-LVS負載均衡群集 構建群集服務器—通過整合多臺服務器使用 LVS 達到服務器的高可用和負載均衡并以同一個 IP 地址對外提供相同的服務 LVS 群集應用基礎 群集稱呼來自英文單詞“Cluster”在服務器領域則表示大量服務器的集合體&#xff0c;區分單個服務器 Cluster …

創新驅動,智享未來:電動車儀表盤之藍牙芯方案

電動車行業不斷發展的浪潮中&#xff0c;我們自豪地推出引領時代的電動車儀表盤藍牙芯方案&#xff0c;為您的騎行之旅帶來前所未有的智能與便捷。 精準掌控&#xff0c;一目了然 我們的藍牙芯方案搭載了高性能BLE 5.0藍牙芯片-HS6621CG-C 內核ARM Cortex-M4F, max 64MHZ,SRAM…

Operations Research課程之帶約束的非線性規劃(凸分析|Lagrange松弛|Lagrange對偶|KKT條件)

目錄 1.凸分析 1.1 為什么需要凸分析 1.2 凸分析相關概念 1.3 凸規劃定義 1.4 單變量NLP凸分析 1.5 多變量NLP凸分析 2.拉格朗日松弛 2.1 拉格朗日函數 2.2 拉格朗日對偶 2.2.1 弱對偶性 2.2.2 凸性 2.2.3 強對偶性 2.2.4 與LP對偶關系 3.KKT條件 3.1 KKT介紹…

Redis 管道(Pipeline)是什么?有什么用?

目錄 1. redis 客戶端-服務端模型的不足之處 2. redis 管道是什么&#xff1f;有什么好處&#xff1f; 3. 管道的使用場景 4. 管道使用的注意事項 1. redis 客戶端-服務端模型的不足之處 眾所周知&#xff0c;redis 是一個客戶端-服務端的模型設計&#xff0c;客戶端向服務…

Qt的信號與槽機制底層原理

Qt的信號與槽機制是Qt框架的核心特性之一&#xff0c;它允許對象之間進行解耦通信。信號&#xff08;Signal&#xff09;是一個類成員函數&#xff0c;當特定事件發生時&#xff0c;信號會被自動觸發。槽&#xff08;Slot&#xff09;也是一個類成員函數&#xff0c;它可以被信…

上海網站建設如何做

上海是中國最繁華的城市之一&#xff0c;作為全國的經濟、文化和科技中心&#xff0c;網站建設在上海變得越來越重要。如何做好上海網站建設&#xff0c;讓網站更加吸引人&#xff0c;成為企業和個人宣傳自身的重要平臺呢&#xff1f; 首先&#xff0c;要有清晰的定位和目標。在…

SCI一區級 | Matlab實現BO-Transformer-BiLSTM時間序列預測

SCI一區級 | Matlab實現BO-Transformer-BiLSTM時間序列預測 目錄 SCI一區級 | Matlab實現BO-Transformer-BiLSTM時間序列預測效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 1.【SCI一區級】Matlab實現BO-Transformer-BiLSTM時間序列預測&#xff0c;貝葉斯優化Transfor…

Zoom視頰會議軟件使用

GPT-3.5 (OpenAI) Zoom是一款極受歡迎的視頻會議軟件。使用Zoom可以方便地進行視頻會議、遠程授課、在線研討會等活動。以下是Zoom的使用步驟&#xff1a; 1. 下載Zoom客戶端 可以在Zoom官網上下載對應平臺的Zoom客戶端。下載并完成安裝后&#xff0c;雙擊打開客戶端。 2. 創建…

【AI】ChatTTS實現文本轉語音

最近有時間繼續研究一下各種有趣的開源項目&#xff0c;一個叫ChatTTS的項目吸引了我的注意&#xff0c;這個項目可以把文本轉換成語音&#xff0c;配合gpt生成文本&#xff0c;可以直接用于生產有聲書作品了&#xff0c;這可以說是直接的生產力項目了。 項目對顯存的要求不高&…

el-table 樹狀表格查詢符合條件的數據

需要對el-table的樹狀表格根據輸入機構名稱&#xff0c;篩選出符合條件的數據&#xff0c;可用如下方法&#xff1a; 頁面內容如下&#xff1a; <el-input v-model"ogeName" placeholder"請輸入機構名稱"><el-table :data"list" row…

Git 操作補充:cherry-pick、變基

1. 挑選提交合并 git cherry-pick 對于多分支的代碼庫&#xff0c;將代碼從一個分支轉移到另一個分支是一種常見的需求&#xff0c;這可以分成兩種情況&#xff1a;一種情況是&#xff0c;你需要另一個分支的所有代碼變動&#xff0c;那么就采用 git merge&#xff1b;另一種情…

如何準確測量 Android 應用中 Activity 和 Fragment 的啟動時間

如何準確測量 Android 應用中 Activity 和 Fragment 的啟動時間 在 Android 應用開發中&#xff0c;了解每個 Activity 和 Fragment 的啟動時間對于性能優化至關重要。本文將介紹幾種方法來準確測量 Activity 和 Fragment 的啟動時間&#xff0c;并提供實際操作步驟&#xff0…

Spark SQL----內置函數JSON Functions

Spark SQL----內置函數JSON Functions JSON Functions 例子&#xff1a; -- from_json SELECT from_json({"a":1, "b":0.8}, a INT, b DOUBLE); --------------------------- |from_json({"a":1, "b":0.8})| -----------------------…

c++之auto

auto auto與for結合begin(),end()說明 auto c11標準引入auto類型說明符必須有初始值通過初始值來推斷變量的類型 #include<cstdio> using namespace std; int main(){int v1 10;auto v2 v1;printf("v2%d\n",v2);double v310.5;auto v4 v3;printf("v4…