網站首頁 編程語言 正文
前言:
一直以來,有很多地方在說到數組和指針時都會說數據就是指針,這種觀點也被越來越多的人接受。本文將主要介紹數組和指針。是不是一樣的大家自己理解。如此而已……
1 數組和指針的概念
數組:具有固定大小和連續內存空間的相同數據集合。里面的存儲的元素具有地址連續性和數據類型相同的特點。
指針:是指存放內存地址的變量。從0開始。32位系統可訪問內存4G,目前64位系統可尋址內存空間為128G。(可能會更大。這個需要硬件資源的支撐。不抬杠)
2 數組和指針的操作
2.1 賦值
數組:對數組元素進行逐個賦值。
指針:相同類型指針可以直接進行賦值。
2.2 存儲
數組:從數組的定義就可以知道。數組的內存是連續的。可以在棧上進行定義也可以通過malloc或者new等在堆上進行定義。
指針:本身是一個變量,指向其對應的類型的變量。指向的地址也是變量的地址,然后在通過該地址獲取它指向變量的值。
2.3 大小
可以通過sizeof
宏進行獲得。
數組:數組的大小通過sizeof(數組名)/sizeof(類型名)獲取。
指針:在32位的操作系統中為4,在64位操作系統中是8。
2.4 初始化
數組的初始化方式為:
//初始化一個雙精度型數組 double balance[5] = {1.0, 2.0, 3.0, 4.0, 5.0}; //初始化一個二維數組 int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
指針的初始化方式為:
//定義一個指向整型變量的指針 int *p=new int(0) ; //定義一個指向數組的指針 int *p=new int[n]; //定義一個指針的指針 int **pp=new (int*)[2];? pp[0]=new int[6]; pp[1]= new int[10];
指針數組和數組指針的定義請移步以下文章:C語言簡明知識系列十一(下):指針
3 數組和指針的傳參
C/C++的傳參方式可以分為傳值型和傳址型,傳值實際上對將參數進行拷貝,在程序運行中對參數做的任何修改都是在拷貝后的變量產生的,函數退出后不會影響傳入參數,傳址型恰恰相反,會對原有參數進行修改。數組和指針當做參數傳入時基本為引用方式,具體要看代碼作者是如何使用。
3.1 數組的傳參
數組傳參分為一維數組和多維數組。當做參數傳入時會退化成指針。
一維數組:
void Fun(int a[]) { ? ? ; } int main() { ? ?int testArray[]={1,2,3}; ? ?Fun(testArray); ? ?return 0; }
如上,當然也可以將Fun函數的參數形式定義為如下形式:
void Fun(int *a) { ? ? ; }
二維數組:
void Fun(int (*a)[5]) { ? ? ; } int main() { ? ?int testArray[2][5]={ ? ? ? ?{1,2,3,4,5}, ? ? ? ?{4,5,6,7,8} ? ?}; ? ?Fun(testArray); ? ?return 0; }
3.2 指針的傳參
如果函數的參數是一個指針。那么可以給函數傳遞的參數為三種,分別是:指針變量、變量的地址、一個數組名。在這里數組名實際上就是指向數組的首地址。
指針:
void Fun_p(int *p){}; int main() { ? ?int testArray[]={1,2,3}; ? ?int *pIntArray = testArray; ? ?int iValue = 10; ? ?//傳遞數組名 ? ?Fun_p(testArray); ? ?//傳遞指針變量 ? ?Fun_p(pIntArray); ? ?//變量地址 ? ?Fun_p(&iValue); ? ?return 0; }
指針的指針:
?
void Fun(int **p) { ? ? ; } int main() { ? ?int testArray[5]={1,2,3,4,5}; ? ?int *pIntArray = testArray; ? ?int iValue = 10; ? ?int *tmpP = &iValue; ? ?//傳遞指針變量 ? ?Fun(&pIntArray); ? ?//變量地址 ? ?Fun(&tmpP); ? ?return 0; }
4 總結
除了上面介紹外,指針還有函數指針,自然就會有指向函數的指針數組以及指向函數指針的指針。在實際使用時,這些類型的引入在指引我們靈活編程的同時也給我們帶來了很大的風險,一旦出錯,排除問題和解決問題的復雜度也將增加。在進行指針編程的時候需要謹慎使用。
函數和數組既有相同點,也有不各自獨特之處。細思之,一些所謂函數既指針的說法需要謹慎判斷。切勿人云亦云!
相關推薦
- 2024-02-27 var、let和const區別
- 2022-07-11 為Spring配置文件的配置項添加元注釋
- 2022-08-22 python作圖基礎之plt.contour實例詳解_python
- 2021-11-28 linux手工配置ip地址詳細步驟_Linux
- 2023-09-17 el-tabs表格右下角按鈕被遮擋
- 2022-11-16 python中如何使用函數改變list_python
- 2023-04-07 C++11學習之多線程的支持詳解_C 語言
- 2023-01-15 關于networkx返回圖的鄰接矩陣問題_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支