C/C++指針操作整理

C/C++指針操作整理

面向曾經學習過指針的人,并非針對究極初學者。

一維指針

數據類型存儲的地址,指向數據存儲的地址,可以使用 &運算符取變量的地址,將其賦給指針變量。

int a = 2;
int *p = &a;

同時因為C/C++中數組是連續存儲的,所以一個指針可以間接訪問一個數組,可以通過指針的解引用訪問該地址處存儲的值。

知識點:

  • 一個數組的數組名默認代表這個數組的地址。
  • 可以通過 地址加減下標法 訪問連續存儲的數據。
int a[4] = {1, 2, 3, 4};
int *p = a;
for (int i = 0; i < 4; ++i) {// 下面兩行代碼等價,
//    std::cout << p[i] << " ";std::cout << *(p + i) << " ";
}

同樣的,對于 char 類型,也有:

char s[] = "ABCDEF";
char *p = s; // s代表字符串首地址
for (int i = 0; i < int(strlen(s)); ++i) {// std::cout << p[i];std::cout << *(p + i); // 輸出單個字符
}
std::cout << "\n";
std::cout << p << "\n"; // 輸出整個字符串

特別的:針對 char 類型,可以直接輸出首地址,編譯器會自動將地址加一往后輸出,直到遇到 \0 字符,即字符串結尾字符。(注意 string 類型沒有 \0 結尾字符)

其他數據類型基本同理。

二維指針

即指針的指針,就是指針存儲的是一個指針變量的存儲地址,輸出的時候就需要兩層解引用了。

int val = 4;
int *p1 = &val;
int **p2 = &p1;
std::cout << **p2 << "\n";

數組指針和指針數組

1 數組指針

即數組的指針,代表整個數組的地址。由于 [] 優先級大于 *, 所以需要使用 () 代表 p 存儲一個長度為 3 的數組的地址。

int (*p)[3];

2 指針數組

即數組中存儲的是指針變量。

int *p[2];

一些指針操作

需要了解下new操作

1 創建二維動態數組

  • 方法一:利用二維指針,C++ new操作

定義一個二維指針,二維指針指向的是長度為 n 的數組(數組中存儲的是指針變量)的地址,即定義 f 時就指向了一個數組的首地址,而這個數組中的每個指針元素代表了二維數組每一行的首地址。

然后利用循環,對二維指針進行操作,每維申請一個長度為 m 的數組,剛好 new 操作返回的就是一個數組的首地址,就可以賦給 f[i]

int **f = new int*[n];
for (int i = 0; i < n; ++i) {f[i] = new int[m];
}
  • 方法二:利用二維指針,C malloc操作
int **f = (int**)malloc(sizeof(int*) * n);
for (int i = 0; i < n; ++i) {f[i] = (int*)malloc(sizeof(int) * m);
}
  • 方法三:使用數組指針

直接定義個數組指針指向整個二維數組

int (*p)[3] = new int[2][3];
int cnt = 0;
for (int i = 0; i < 2; ++i) {for (int j = 0; j < 3; ++j) {// *(*(p + i) + j) = ++cnt;// std::cout << *(*(p + i) + j) << " \n"[j == 2];p[i][j] = ++cnt;std::cout << p[i][j] << " \n"[j == 2];}
}
  • 方法四:使用C++ vector

聲明了等價于 a[n][m] 的數組

vector<vector<int>> a(n, vector<int>(m, 0));

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

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

相關文章

Java實現插入排序算法

插入排序算法 &#xff08;1&#xff09;概念&#xff1a;通過構建有序序列&#xff0c;對于未排序數據&#xff0c;在已排序序列中從后向前掃描&#xff0c;找到相應的位置并插入。 &#xff08;2&#xff09;一個通俗的比喻&#xff1a; 插入排序就類似于斗地主時&#xf…

CloudCompare 二次開發(23)——計算兩點云之間的放縮倍數

目錄 一、概述二、代碼集成三、結果展示一、概述 使用CloudCompare編程實現計算兩點云之間的放縮倍數。具體計算原理見:。 二、代碼集成 1、mainwindow.h文件public中添加: void doActionComputeScale(); // 計算兩點云的放縮倍數2、mainwindow.cpp文件void MainWin…

vue-element使用html2canvas實現網頁指定區域(指定dom元素)截圖

直接上代碼&#xff1a; <template><el-dialog :visible.sync"printDialogVisible" width"1000px" :close-on-click-modal"false" append-to-body><template><div :id"print_content" ref"print_content&q…

Python網絡爬蟲的基礎理解-對應的自我理解誤區

##通過一個中國大學大學排名爬蟲的示例進行基礎性理解 以軟科中國最好大學排名為分析對象&#xff0c;基于requests庫和bs4庫編寫爬蟲程序&#xff0c;對2015年至2019年間的中國大學排名數據進行爬取&#xff1a;&#xff08;1&#xff09;按照排名先后順序輸出不同年份的前10…

Linux下通過find找文件---通過修改時間查找(-mtime)

通過man手冊查找和-mtime選項相關的內容 man find | grep -A 3 mtime # 這里簡單介紹了 -mtime &#xff0c;還有一個簡單的示例-mtime n Files data was last modified n*24 hours ago. See the comments for -atime to understand how rounding affects the interpretati…

【已解決】解決Win7虛擬機打開網頁報錯的情況

因為剛才下載了個虛擬機&#xff0c;同樣出現了無法安裝VMtools的情況&#xff0c;所以想直接通過虛擬機的瀏覽器來下載一個補丁&#xff08;因為自己的U盤在虛擬機上面無法識別&#xff0c;應該是太老了Win7&#xff09; 結果發現Win7內置的IE瀏覽器太拉了。于是向下載一個火…

深度學習記錄--神經網絡表示及其向量化

神經網絡表示 如下圖 就這個神經網絡圖來說&#xff0c;它有三層&#xff0c;分別是輸入層(Input layer)&#xff0c;隱藏層(Hidden layer)&#xff0c;輸出層(Output layer) 對于其他的神經網絡&#xff0c;隱藏層可以有很多層 一般來說&#xff0c;不把輸入層算作一個標準…

【ITK庫學習】使用itk庫進行圖像濾波ImageFilter:幾何變換:翻轉、重采樣(未完)

目錄 1、itkFlipImageFilter 圖像翻轉濾波器2、itkResampleImageFilter 重采樣圖像濾波器 1、itkFlipImageFilter 圖像翻轉濾波器 該類的主要功能是使輸入數據在用戶指定的軸上進行翻轉。 翻轉軸通過函數SetFlipAxes(array) 設置&#xff0c;其中輸入是FixArray<bool,Imag…

UML圖的各種類型以及軟件設計師考試考察的方式

UML建模 前言 常見的UML的類型 UML 比前兩題是更難的&#xff08;略高&#xff0c;但是學會就可以了。前兩題是&#xff1a;數據流圖&#xff0c;數據庫的設計&#xff09;&#xff0c;因為UML圖有很多類型&#xff1a;用例圖&#xff0c;類圖與對象圖&#xff0c;順序圖&…

3_CSS層疊樣式表基礎

第3章-CSS層疊樣式表基礎 學習目標(Objective) 掌握標簽選擇器的使用掌握類選擇器的使用了解id選擇器和通配符選擇器掌握font屬性和color屬性的應用 1.HTML的局限性 如果要改變下高度或者變一個顏色&#xff0c;就需要大量重復操作 總結&#xff1a; HTML滿足不了設計者的需…

Emacs之dired模式重新綁定鍵值v(一百三十一)

簡介&#xff1a; CSDN博客專家&#xff0c;專注Android/Linux系統&#xff0c;分享多mic語音方案、音視頻、編解碼等技術&#xff0c;與大家一起成長&#xff01; 優質專欄&#xff1a;Audio工程師進階系列【原創干貨持續更新中……】&#x1f680; 優質專欄&#xff1a;多媒…

uniapp實戰 —— 輪播圖【數字下標】(含組件封裝,點擊圖片放大全屏預覽)

組件封裝 src\components\SUI_Swiper2.vue <script setup lang"ts"> import { ref } from vue const props defineProps({config: Object, })const activeIndex ref(0) const change: UniHelper.SwiperOnChange (e) > {activeIndex.value e.detail.cur…

Python——數據容器

數據容器操作的異同點 項目列表list元組tuple字符串str集合set字典dict元素數量支持多個支持多個支持多個支持多個支持多個元素類型任意任意僅字符任意key&#xff1a;除字典外任意類型&#xff1b;value&#xff1a;任意類型下標索引支持支持支持不支持不支持重復元素支持支持…

yarn link使用(npm link)

使用場景 前端開發中&#xff0c;兩個項目相互依賴時&#xff0c;使用yarn link(npm link)鏈接 例如&#xff1a;A項目依賴于本司自己的UI庫B&#xff0c;當我們修改了UI庫B中的某些代碼時&#xff0c;需本地驗證后再發布到私服&#xff0c;此時A項目與UI項目B通過yarn link連…

數據可視化:解鎖企業經營的智慧之道

在現代企業管理中&#xff0c;數據可視化已經成為了一項重要的工具。它不僅僅是簡單地展示數據&#xff0c;更是提供了深入理解數據、做出更明智決策的方法。作為一名可視化設計從業人員&#xff0c;我經手過一些企業自用的數據可視化項目&#xff0c;今天就來和大家聊聊數據可…

數字化升級,智慧醫療新時代——醫院陪診服務的技術創新

在信息技術飛速發展的今天&#xff0c;醫療服務正迎來數字化升級的新時代。本文將探討如何通過先進技術的應用&#xff0c;為醫院陪診服務注入更多智慧元素&#xff0c;提升患者和家屬的醫療體驗。 1. 創新醫療預約系統 # Python代碼演示醫療預約系統的簡單實現 class Medic…

輸入框的透明度影響placeholder的透明度怎么解決

有一個需求是需要寫如上圖所示的輸入框。 首先想到的是調整輸入的透明度 <div class"inputDiv"><img src"./images/search.png" /><input type"text" class"myInput" placeholder"請輸入標題關鍵字"/> &…

飛天使-linux操作的一些技巧與知識點

命令行光標移動到行首行尾 ctrl a 跳到首 ctrl e 跳到尾/etc/passwd rpm 包格式 RPM&#xff08;Red Hat Package Manager&#xff09;是一種常用的Linux軟件包管理系統&#xff0c;它使用特定的命名規則來標識和命名軟件包。RPM包的名稱格式通常遵循以下規則&#xff1a;…

Qt基礎-修改Qt Creator界面字體

Qt Creator設計時字體太小,有時需要自定義一下,本文講解如何修改Qt Creator界面字體。 一、創建樣式文件 創建CSS文件,定義名稱為custom-style.css 編寫內容: QWidget { font: 12pt "Microsoft YaHei"; }QPlainTextEdit { font: 12pt "Microsoft YaHei&…

FPGA時序分析與約束(0)——目錄與傳送門

一、簡介 關于時序分析和約束的學習似乎是學習FPGA的一道分水嶺&#xff0c;似乎只有理解了時序約束才能算是真正入門了FPGA&#xff0c;對于FPGA從業者或者未來想要從事FPGA開發的工程師來說&#xff0c;時序約束可以說是一道躲不過去的坎&#xff0c;所以這個系列我們會詳細介…