網(wǎng)站首頁 編程語言 正文
指針是什么?
那到底什么是指針呢,其實(shí)指針和之前學(xué)習(xí)的變量基本相似,不過變量里面放的是一些值,而指針里面放的是它所指的地方的地址。在聲明一個變量是,計算機(jī)就會為該變量預(yù)留一個位置,而指針?biāo)?的就是那個位置。
舉個例子:
int a = 10;
//設(shè)置一個變量a的值為10
int *p = &a;
//p這個指針里面就放的是a的地址
而&這個符號,就是取地址符,就像我們在使用scanf函數(shù)時? scanf("%d",&a); 這個a前面的&是一個意思,就是獲取到某個變量的地址。
而當(dāng)你創(chuàng)建了一個指針是,你就要給他賦地址,否則的話它就會像那種鼠標(biāo)一樣在硬盤上亂找,就會隨機(jī)找個地址,所以我們在創(chuàng)建了指針時,就一定要給他去給他賦一個位置。
指針的基礎(chǔ):
如何創(chuàng)建一個指針函數(shù)呢?
int p;
這是我們之前就知道的,創(chuàng)建一個整形變量p,而int *p;
?就是設(shè)置一個指針p;關(guān)鍵就是在于中間的 *。所以我們在創(chuàng)建指針變量時,一定不要忘記 *;
指針的賦值:
可以在創(chuàng)建指針的時候就賦值像這樣:int *p = &a;
? 也可以在創(chuàng)建了之后單獨(dú)賦值像這樣: int *p;? ?p = &a;
? ?兩種方法都一樣,沒有太大的區(qū)別,只不過一個一行代碼,一個兩行代碼,如果我們之前已經(jīng)創(chuàng)建了變量,那我們還是在創(chuàng)建指針的時候就直接給他賦值,以免后面忘了,對自己后續(xù)的程序發(fā)生影響。
那指針到底能干什么呢?
#include <stdio.h> int main() { int a = 10; int *p = &a; printf("a的地址為%p",&a);//這是直接輸出a的地址 printf("a的地址為%p",p);//只是輸出p的指針?biāo)傅牡刂? printf("a的值為%d",*p);//輸出p的指針?biāo)傅牡刂分凶兞康闹? return 0; }
通過這3個輸出函數(shù)我們可以知道,前兩個輸出的都是a的地址,而第三個輸出的則是a變量里的值。
所以我們可以理解為 *p
就是 a
這個變量的值,這就是最通俗易懂的理解了。
并且在輸出 p
時也就是輸出 a
的地址時,也是有不同的輸出方式的,最基礎(chǔ)的就是
- %lu 是十進(jìn)制的方式輸出;
- %p是以十六進(jìn)制的方式輸出;
之前說到 *p 可以看作是它所指的 a 變量的值,所以它也是可以再重新被賦值的,當(dāng)然它的賦值不是給指針函數(shù)賦值,看似是在給指針賦值,其實(shí)改變的還是它所指的函數(shù)的值;
像這樣
int a,*p; a = 10; p = &a; *p = 20; printf("a = %d",*p);
這個函數(shù)所輸出的值就會為 20 ;因為指針是之間在你的地址上給你改變,所以說指針的改變相比較之前的函數(shù)就會方便很多,比如我們在學(xué)習(xí)函數(shù)的時候,會將值從主函數(shù)傳到其他的函數(shù)中去做計算,但是傳回來時就很麻煩,因為它一次只能傳回來一個值,但是指針就不一樣了,它不需要將值傳回來,直接時實(shí)時將它所指的值進(jìn)行改變;
像接下來這個例子,我們之前也都用函數(shù)的方式寫過;
#include <stdio.h> void swap(int* p, int* q) { int temp; temp = *p; *p = *q; *q = temp; } int main() { int a = 10, b = 20; swap(&a, &b); printf("a=%d b=%d",a,b); return 0; }
這個函數(shù)最后輸出的值為
可以看到,輸出的值已經(jīng)發(fā)生了交換,這就是指針的強(qiáng)大之處吧;
可以更簡單的來解決我們之前遇到的問題,所以說,學(xué)好指針是學(xué)好c語言的基礎(chǔ)!
原文鏈接:https://blog.csdn.net/weixin_64337113/article/details/121932922
相關(guān)推薦
- 2022-07-21 CUICatalog: Invalid asset name supplied: ‘‘
- 2024-04-07 springboot整合redis配置
- 2022-12-05 通過sc命令獲得System權(quán)限的代碼_DOS/BAT
- 2022-08-22 C#使用MSTest進(jìn)行單元測試_C#教程
- 2023-02-17 pytorch中nn.Flatten()函數(shù)詳解及示例_python
- 2022-05-23 Python?圖形界面框架TkInter之在源碼中找pack方法_python
- 2022-07-19 圖片打包加載出錯
- 2022-04-27 .Net?Core中使用MongoDB搭建集群與項目實(shí)戰(zhàn)_基礎(chǔ)應(yīng)用
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支