網(wǎng)站首頁 編程語言 正文
前言
經(jīng)過了指針的初步學習,我們了解了指針有以下特點:
1. 指針就是個變量,用來存放地址,地址唯一標識一塊內(nèi)存空間。
2. 指針的大小是固定的4/8個字節(jié)(32位平臺/64位平臺)。
3. 指針是有類型,指針的類型決定了指針的+-整數(shù)的步長,指針解引用操作的時候的權(quán)限。
4. 指針的運算。
今天將要從各種不同的指針的角度切入,使得我們對指針的了解更加深入。
字符指針
我們現(xiàn)在已經(jīng)學會下面的這種指針的使用了:
int main()
{
char ch = 'w';
char* pc = &ch;
*pc = 'w';
return 0;
}
通過這段代碼,把字符變量ch的地址賦給了pc,同時pc的類型是char*。
接下來讓我們來看一看另一段代碼:
int main()
{
const char* pstr = "hello bit.";//這里是把一個字符串放到pstr指針變量里了嗎?
printf("%s\n", pstr);
return 0;
}
我們看到,這里是把一個字符串常量和指針pstr關(guān)聯(lián)起來了。并且無論有沒有加const,常量的內(nèi)容是不能改變的。
int main()
{
char* pstr = "hello bit.";//這里是把一個字符串放到pstr指針變量里了嗎?
*pstr = 'w';
printf("%s\n", pstr);
return 0;
}
當我們?nèi)缟蠄D代碼一樣,試圖改變常量字符串時就會報錯:
讓我們來通過下面的代碼了解內(nèi)部的邏輯:
int main()
{
char str1[] = "hello world.";
char str2[] = "hello world.";
const char *str3 = "hello world.";
const char *str4 = "hello world.";
if(str1 ==str2)
printf("str1 and str2 are same\n");
else
printf("str1 and str2 are not same\n");
if(str3 ==str4)
printf("str3 and str4 are same\n");
else
printf("str3 and str4 are not same\n");
return 0;
}
根據(jù)代碼和運行結(jié)果,我們可以知道指針指向的常量字符串的地址是相同的,但把字符串賦予數(shù)組時,地址不同,讓我們用圖來描述這個過程。
同時str1,str2,str3,str4,指的都是字符串首字符的地址。
指針數(shù)組
指針數(shù)組的本質(zhì)是數(shù)組,只是在數(shù)組中存放的內(nèi)容是指針變量。
接下來讓我們看看指針數(shù)組長什么樣:
int* arr1[10]; //整形指針的數(shù)組
char *arr2[4]; //一級字符指針的數(shù)組
char **arr3[5];//二級字符指針的數(shù)組
指針數(shù)組可以類比普通數(shù)組,比如:
我們可以發(fā)現(xiàn),指針數(shù)組和普通數(shù)組的區(qū)別僅僅是數(shù)組中儲存的元素類型不一樣,所以說指針數(shù)組本質(zhì)上還是數(shù)組。
數(shù)組指針
說完了指針數(shù)組,讓我們來了解一下數(shù)組指針 ,數(shù)組指針本質(zhì)上是一個指針。接下來讓我們類比一下數(shù)組指針和我們常見的指針:
讓我們通過一段代碼來深入了解 數(shù)組指針的特點:
int main()
{
int arr[10] = { 0 };
printf("arr = %p\n", arr);
printf("&arr= %p\n", &arr);
printf("arr+1 = %p\n", arr + 1);
printf("&arr+1= %p\n", &arr + 1);
return 0;
}
通過學習我們知道arr是數(shù)組首元素的地址,&arr是整個數(shù)組的地址,可類比為普通指針和數(shù)組指針。
函數(shù)指針
函數(shù)指針就是存放函數(shù)地址的指針 ,通過函數(shù)指針可以調(diào)用相應(yīng)的函數(shù)。
void test()
{
printf("hehe\n");
}
int main()
{
printf("%p\n", test);
printf("%p\n", &test);
return 0;
}
通過這段代碼我們了解到,函數(shù)是有地址的,那怎么把這個地址賦予指針呢?
void test()
{
printf("hehe\n");
}
int main()
{
printf("%p\n", test);
printf("%p\n", &test);
void (*p)() = test;
(*p)();
return 0;
}
以上代碼讓我們知道了,函數(shù)是可以通過指針調(diào)用的。
原文鏈接:https://blog.csdn.net/JDSZGLLL/article/details/125091414
相關(guān)推薦
- 2023-03-16 Python?import導入上級目錄文件的方法_python
- 2022-11-03 一文詳解C++子類函數(shù)為什么不能重載父類函數(shù)_C 語言
- 2022-06-14 Python?torch.fft.rfft()函數(shù)用法示例代碼_python
- 2022-05-13 python魔法方法之__setattr__()_python
- 2022-02-18 yml配置文件中存在@無法識別,報錯:found character ‘@‘ that cannot
- 2022-12-25 Redis對象與redisObject超詳細分析源碼層_Redis
- 2022-12-11 Go語言實現(xiàn)棧與隊列基本操作學家_Golang
- 2022-07-24 C++算法學習之分支限界法的應(yīng)用_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(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被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支