C/C++ 指針的深入理解

文章目錄

    • 內存結構
    • 地址就是指針
      • 為什么地址就是指針?
    • 指針:地址的外號&
      • 變量空間開辟于內存
        • 1.所開辟的空間字節數>=1字節
        • 2.變量的每個字節都一個地址
        • 3.變量的第一個字節的地址代表整個變量的地址
        • 4.如何使用變量的指針找到整個變量空間?
    • 變量指針就是一個數
    • 如何使用一個數據
    • 一級指針與一級指針變量
      • 什么是一級指針
      • 什么是普通變量
      • 普通變量指針的類型
    • 使用指針訪問變量空間
      • 使用指針訪問空間
      • 如何找到a變量地址,然后讀、寫a變量地址
      • 使用指針操作a變量空間
      • *的兩種用途
    • 指針的好處
      • 傳遞指針
    • 傳遞普通數值與傳遞指針的異同
      • 指針的含義
      • 連續內存
      • 內存單一

內存結構

內存是由字節組成的
每個字節都有一個地址

地址就是指針

地址的別稱就是指針

為什么地址就是指針?

因為地址有指向作用,通過這個地址可以找到某個字節空間,然后操作(讀、寫)字節空間,因為地址有指向作用,因此我們也稱地址為指針。

舉個例子:
稱門牌號為指針,因為門牌號指向了某個房間,當然我們可以稱自己家的地址為指針,因為我家的地址指向了我家,根據門牌號和地址的指向,可以找到某個房間和我家,帶有指向作用的是指針。

指針:地址的外號&

變量空間開辟于內存

1.所開辟的空間字節數>=1字節

比如

char型變量     1個字節
short型變量    2個字節
int型變量      4個字節
float型變量    4個字節
double型變量   4個字節

sizeof是運算符不是函數

2.變量的每個字節都一個地址

3.變量的第一個字節的地址代表整個變量的地址

即變量的指針就是變量第一個字節的地址
使用變量的地址(第一個字節的地址),找到相應的變量空間,進行操作,讀或寫變量空間

4.如何使用變量的指針找到整個變量空間?

a.通過變量指針找到變量的第一個字節
b.根據變量的類型得到變量所占的總的字節,從第一個字節往后數,找到變量空間所有字節

變量指針就是一個數

a. 指針這個數好比門牌號
指針就是一個數,只是這個數有點特殊,它是一個地址
門牌號是房間的地址,用來指向某個房間。
b. C語言采用什么方法得到一個變量的指針 ?
方法使用取地址符 &

int a;
&a //表示a變量的第一個地址,即a變量的指針。
printf("%p\n",&a); //16進制打印

提示: 打印一個變量的指針這個數時,可以采用%d方式打印,這也說明指針是一個比較特殊的整形數,但是你又不能說它是整形數,它是一個地址,我們也可以用%p,這個是地址專用的16進制打印形式打印結果

int a;
a指的是一個變量空間,我們可以向空間讀寫數據
&a指的是一個數,是變量a的指針,或者第一個字節的地址。

如何使用一個數據

a. 使用普通的整形數

直接使用
比如 printf("%d",10);

間接使用
先把這個數放到對應類型的變量中,通過使用變量來使用這個數
正常情況下,在不涉及類型轉換時,我們要求將某個類型的數據,放到對應類型的變量中,要求類型必須保持一致

b.使用變量指針這個數
直接使用

int a=10;
printf("%d",&a);

間接使用
先把這個指針(數)放到一個變量中,然后通過這個變量使用這個數
存放指針這個數的變量就是指針變量。

int a=10;
printf("%d\n",&a);
int *p=&a;
printf("%d\n",p);
return 0; 

一級指針與一級指針變量

什么是一級指針

 a.指針:地址就是指針,指針是地址的別稱,指針是一個數,是一個字節的門牌號(地址)。b.變量的指針:變量空間的第一個字節地址c.什么是一級指針所有普通變量的指針就是一級指針

什么是普通變量

只要在變量的聲明或定義中,沒有*的變量就是普通變量
例如:int a;

普通變量指針的類型

指針的等級:

一級:* 類型
二級:** 類型
三級:*** 類型

一般不會超過三級
一級指針表示指針指向一個普通變量

 char a='a';&a; //普通變量a的指針,表示第一個字節的地址char*類型:char型一級指針類型,*表示一級,char表示這個指針指向的變量空間是一個char型變量空間

使用指針訪問變量空間

使用指針訪問空間

&a //一個數,表示a變量的第一個地址,即a變量的指針(門牌號)
int *pa;//表示定義一個整型的一級指針變量,用于存放整形一級指針(數)
int *pa=&a;

如何找到a變量地址,然后讀、寫a變量地址

1.直接通過變量名進行操作
寫數據:a=100;
讀數據:int b; b=a;

使用指針操作a變量空間

寫數據

*pa=200; //等價于a=100

讀數據

int b=*pa;    //等價于int b=a;
此時,*pa代表的就是a變量空間,我們可以對其讀寫
這里的*找空間操作:找到指針變量pa里面存放的指針(數據)所指向的空間。

*的作用就是找到指針指向的空間。

*的兩種用途

  1. 定義指針變量時使用,比如
int *pa; //定義一個int型的一級指針
*表示定義的是指針變量,一個*表示一級指針變量

2.訪問空間時使用*

int a;
int *pa=&a;
*pa=100;//*找空間操作,找到pa這個指針變量里面放的指針所指向空間,*pa代表指針指向空間

指針的好處

int a=10;
int *pa=&a; //pa里面放的是a的門牌號a=100; //使用變量名a訪問變量空間,寫空間,把100寫入
int b=a;//使用變量名a訪問變量空間,讀空間,將空間里面存放的數讀出,賦值(寫)給b*pa=200; //等價于a=200,*pa代表的就是a空間,然后對其進行寫操作
b=*pa; //等價于b=a,*pa代表的就是a空間,然后從a空間讀數據,寫入b變量

傳遞指針

#include<stdio.h>void fun(int *pa,float *pb) {*pa=200;*pb=300.60;}
int main() {int a=10;float b=0.56;fun(&a,&b);printf("in main a=%d\n",a);printf("in main b=%f",b);return 0;
}

等價于

#include<stdio.h>
#include<string.h>void fun(int *pa,float *pb) {*pa=200;*pb=300.60;}int main() {int a=10;float b=0.56;
//	fun(&a,&b);int *pa=&a;float *pb=&b;fun(pa,pb);printf("in main a=%d\n",a);printf("in main b=%f",b);return 0;
}

傳遞普通數值與傳遞指針的異同

(1)相同點
都是將實參的數賦值給形參變量。
(2)區別
前者傳遞的是一個普通的數,后者傳遞的是門牌號,即地址(指針),可以通過地址操作它指向的變量空間。

指針的含義

a.指針是一個數
指針是一個地址,變量的指針指的都是變量第一個字節的地址。
地址(指針)具備指向作用

b.指針變量
指針變量是一個變量,用來存放指針(地址),指針變量不具有指向作用,指針變量只是用來存放地址。指針變量因為存放地址才有了指向作用,指針變量存放的指針具有指針作用
指針和指針變量是兩個不同的概念,只是約定俗成,習慣統一稱為指針。

提示:

當一個指針變量里面存放指針這個數后,即這個指針變量指向了某個空間,但是你自己應該非常清楚,本質并不是指針變量指向某個空間,而是這個指針變量內存放的指針指向某個空間。

連續內存

//連續的動態分配 
#include<stdio.h>
#include<stdlib.h>
int main(){
//	int *p=(int *)malloc (5*sizeof(int));
// 	*(p+3)=3;
//    printf("%d",*(p+3));int number;printf("input student number:");scanf("%d",&number);int *p=(int *)malloc (sizeof(int)*number);for(int i=0;i<number;i++){printf("input %d someone's  grade:",i+1);
//   	scanf("%d",&p[i]);scanf("%d",p+i);} //輸出for(int i=0;i<number;i++){printf("%d\t",p[i]);//*(stu+i) } printf("\n");return 0;
} 

內存單一

//單一元素 
#include<stdio.h>
#include<stdlib.h>
int main(){int *p=(int *)malloc(sizeof(int));*p=3;printf("%d",*p);return 0;
} 

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

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

相關文章

linux基礎必備

文章目錄Linux系統中常用目錄結構Linux下如何從普通用戶切換到root用戶Linux系統常用命令Linux系統文件中相關指令Linux查看開機自啟動服務Linux常見服務列表Linux關閉某些服務&#xff08;臨時關閉&#xff09;Linux關閉服務開機自啟動Linux中在屏幕輸入一句話Linux查看系統進…

Hadoop搭建集群中輸入hdfs namenode -format格式化節點時,提示:hdfs: command not found 解決辦法

分析原因&#xff1a; hadoop的安裝路徑沒有加入到當前路徑中 解決辦法&#xff1a; 方法1&#xff1a; 進入hadoop的安裝目錄&#xff0c;在執行hadoop命令時在前面加上&#xff1a;./bin ./sbin 方法2: 進入/etc/profile文件中添加hadoop的安裝路徑 sudo vim /etc/profile添…

Python 微信定向問好

from numpy import * import itchat from threading import Timerdef get_userName():itchat.auto_login(hotReloadTrue)frienditchat.search_friends(name"飛鳥信")print(friend)userName friend[0][UserName]return userNamedef send_msg():userName get_userNam…

Linux高級編程實驗(30個)

文章目錄1&#xff09;輸出Linux下的c也不是太難嘛&#xff01;在linux下編輯&#xff0c;編譯&#xff0c;運行2&#xff09;編寫一個簡單地c語言程序,根據輸入的兩個整數求平均值并且在終端輸出&#xff0c;通過gcc編譯器得到它的匯編程序文件。3&#xff09;編寫一個c語言程…

jsp中String path = request.getContextPath()的作用

<% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":"request.getServerPort()path"/"; %>上述語句是用來拼接當前網頁的相對路徑 request.getContextPath()獲取web項目的根路…

登錄界面驗證碼的實現

文章目錄Javaweb實現驗證碼前端后臺Springboot添加驗證碼項目結構依賴控制類前端頁面效果圖Javaweb實現驗證碼 前端 添加樣式 <meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0, minimum-scale1.…

Javaweb MVC設計模式、Modle發展史、項目分層和三層架構

文章目錄MVC設計模式MVC的目的MVC舉例jspservletjavabean模式MVC的優點MVC的缺點Modle 發展史項目分層三層架構MVC設計模式 MVC模式&#xff08;Model-View-Controller&#xff09;是軟件工程中的一種軟件架構模式&#xff0c;把軟件系統分為三個基本部分&#xff1a;模型&…

HTML表格和HTML表單

HTML 表格 表格由 <table> 標簽來定義每個表格均有若干行&#xff08;由 <tr> 標簽定義&#xff09;&#xff0c;每行被分割為若干單元格&#xff08;由 <td> 標簽定義&#xff09; 字母 td 指表格數據&#xff08;table data&#xff09;&#xff0c;即數據…

Eclispe創建jsp文件,提示錯誤:“The import Xxx cannot be resolved“的解決方案

解決方案&#xff1a; a.(可能是jdk、tomcat版本問題) 右鍵項目->build path&#xff0c;將其中 報錯的 libary或lib 刪除后重新導入 b.清空各種緩存&#xff1a;右鍵項目->Clean tomcat... clean &#xff08;Project -clean或者 進tomcat目錄 刪除里面work的子目錄&a…

JSP訪問數據庫,Session對象和九大內置對象

文章目錄JSP訪問數據庫Session對象JSP九大內置對象JSP訪問數據庫 JSP就是在HTML中嵌套的java代碼&#xff0c;因此java代碼可以卸載JSP中&#xff08;<% … %>&#xff09; 導包操作&#xff1a; Java項目&#xff1a;1. Jar復制到工程中2.右鍵該Jar&#xff1a;build p…

HDFS學習 Java連接hadoop

文章目錄建立連接獲取hadoop下的文件信息編寫hadoop連接工具類建立連接獲取hadoop下的文件信息 import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.BlockLoc…

解決虛擬機沒有ens33網卡的問題

話不多說&#xff0c;直接操作 解決辦法 1.在終端中輸入: sudo vim /etc/network/interfaces進入interfaces文件后&#xff0c;然后輸入以下代碼&#xff0c;然后保存退出 auto ens33 iface ens33 inet dhcp 2.重啟虛擬機 輸入ifconfig命令&#xff0c;成功啟動ens33網卡

HDFS上傳文件命令報錯org.apache.hadoop.ipc.RemoteException(java.io.IOException)

作為作者&#xff0c;強烈不建議進行格式化hadoop&#xff0c;畢竟開發數據是最為重要的&#xff01; Hadoop 3.1 hdfs dfs -put /源文件路徑 /目的文件路徑解決方案 第一步&#xff1a;停止主節點&#xff08;Master&#xff09;和子節點服務&#xff08;Slave&#xff09; …

hadoop退出安全模式Name node is in safe mode

解決方案&#xff1a; hadoop dfsadmin -safemode leave或者&#xff1a; hdfs dfsadmin -safemode leave

圖(Graph)的學習

文章目錄圖的認識圖的概念無向圖有向圖簡單圖完全圖子圖連通、連通圖、連通分量邊的權和網加權圖鄰接和關聯路徑簡單路徑、簡單回路環頂點的度、入度和出度割點&#xff08;關節點&#xff09;橋(割邊)距離有向樹圖的表示鄰接列表鄰接矩陣圖的遍歷深度優先遍歷廣度優先遍歷生成…

并查集(Disjiont Set)

并查集 并查集的最大作用是檢測一個圖上面存不存在環。 無向圖&#xff0c;六個頂點 顯然 1-2-4-3連成一個環 #include<stdio.h> #include<stdlib.h>#define VERTICES 6void initialise(int parent[]){int i;for(i0;i<VERTICES;i){parent[i]-1; }}int find_…

采用Kruskal算法生成最小生成樹,并采用并查集的合并優化和查詢優化。

文章目錄最小生成樹1.什么是圖的最小生成樹&#xff08;MST&#xff09;?2.最小生成樹用來解決什么問題&#xff1f;Kruskal&#xff08;克魯斯卡爾&#xff09;算法算法描述圖解最小生成樹 1.什么是圖的最小生成樹&#xff08;MST&#xff09;? 用N-1條邊連接N個點&#x…

Java操作HBase

rowkey查詢 //根據rowKey進行查詢public static User getDataByRowKey(String tableName, String rowKey,String password) throws IOException {Admin admin connection.getAdmin();Table table connection.getTable(TableName.valueOf(tableName));Get get new Get(rowKe…

Java連接Mysql數據庫(JDBC)

文章目錄導入包con、stmt、rs 三者存在一定的關系getInt和getStringinput.nextInt();簡單使用講解ResultSet和StatementPreparedStatement的用法JDBC連接代碼更多樣例導入包 import java.sql.Connection; import java.sql.DriverManager; import java.sql.statement; import j…