【時時三省】(C語言基礎)通過指針引用字符串

山不在高,有仙則名。水不在深,有龍則靈。 ----CSDN 時時三省

如在printf函數中輸出一個字符串。這些字符串都是以直接形式(字面形式)給出的,在一對雙撇號中包含若干個合法的字符。使用字符串的更加靈活方便的方法——通過指針引用字符串。

字符串的引用方式

在C程序中,字符串是存放在字符數組中的。想引用一個字符串,可以用以下兩種方法。

( 1 )用字符數組存放一個字符串,可以通過數組名和下標引用字符串中一個字符,也可以通過數組名和格式聲明“% s”輸出該字符串。

例題1:

定義一個字符數組,在其中存放字符串" I love China !”,輸出該字符串和第8個字符。

解題思路:

定義字符數組string,對它初始化,由于在初始化時字符的個數是確定的,因此可不必指定數組的長度。用數組名string和輸出格式%s可以輸出整個字符串。用數組名和下標可以引用任一數組元素。

編寫程序:

運行結果:

程序分析:

在定義字符數組string時未指定長度,由于對它初始化,因此它的長度是確定的,長度應為14,其中13個字節存放" I love China ! "13個字符,最后一個字節存放字符串結束符' \0 '。數組名string代表字符數組首元素的地址。題目要求輸出該字符串第8個字符,由于數組元素的序號從0起算,所以應當輸出string [ 7 ],它代表數組中序號7的元素的值(它的值是字母C)。實際上string [ 7 ]就是* ( string + 7 ),string + 7是一個地址,它指向字符“C”。

( 2 )用字符指針變量指向一個字符串常量,通過字符指針變量引用字符串常量。

例題2:

通過字符指針變量輸出一個字符串。

解題思路:

可以不定義字符數組,只定義一個字符指針變量,用它指向字符串常量中的字符。通過字符指針變量輸出該字符串。

編寫程序:

運行結果:

I love China!

程序分析:

在程序中沒有定義字符數組,只定義了一個char*型的指針變量(字符指針變量)string,用字符串常量" I love China !”對它初始化。C語言對字符串常量是按字符數組處理的,在內存中開辟了一個字符數組用來存放該字符串常量,但是這個字符數組是沒有名字的,因此不能通過數組名來引用,只能通過指針變量來引用。

對字符指針變量string初始化,實際上是把字符串第1個元素的地址(即存放字符串的字符數組的首元素地址)賦給指針變量string,使string指向字符串的第1個字符,由于字符串常量“Ilove China !”已由系統分配在內存中連續的14個字節中,因此,string就指向了該字符串的第一個字符。在不致引起誤解的情況下,為了簡便,有時也可說string指向字符串" I love China !”,但應當理解為“指向字符串的第1個字符”。

說明:有人誤認為string是一個字符串變量,以為在定義時把“I love China !”這幾個字符賦給該字符串變量,這是不對的。在C語言中只有字符變量,沒有字符串變量。

分析定義string的行:

char * string = " I love China !”;

等價于下面兩行:

char * string ;

string = " I love China ! ";

注意:string被定義為一個指針變量,基類型為字符型。請注意它只能指向一個字符類型數據,而不能同時指向多個字符數據,更不是把“Ilove China ! "這些字符存放到string中(指針變量只能存放地址),也不是把字符串賦給* string。只是把" I love China !”的第1個字符的地址賦給指針變量string。

不要認為上述定義行等價于

char * string ;

* string = " I love China !”;

可以對指針變量進行再賦值,如:

string = " I am a student , " ;

把字符串" I am a student .”的第一個字符的地址賦給指針變量string。此后string就指向" I am a student .”的第一個字符,不再指向" I love China !”的第一個字符了,因此不能再通過string引用字符串" I love China !”。

可以通過字符指針變量輸出它所指向的字符串,如:

printf ( " % s\n " , string );

% s是輸出字符串時所用的格式符,在輸出項中給出字符指針變量名string,則系統會輸出string所指向的字符串第1個字符,然后自動使string加1,使之指向下一個字符,再輸出該字符…如此直到遇到字符串結束標志 \0 為止。注意,在內存中,字符串的最后被自動加了一個\0 ,因此在輸出時能確定輸出的字符到何時結束。可以看到,用%s可以對一個字符串進行整體的輸入輸出。

?

對字符串中字符的存取,可以用下標方法,也可以用指針方法。

例題3:

將字符串a復制為字符串b,然后輸出字符串b。

解題思路:

定義兩個字符數組a和b,用“I am a student .”對a數組初始化。將a數組中的字符逐個復制到b數組中。可以用不同的方法引用并輸出字符數組元素,今用地址法算出各元素的值。

編寫程序:

運行結果:

程序分析:?

程序中a和b都定義為字符數組,今通過地址訪問其數組元素。在for語句中,先檢查a [ i ]是否為 \0 ?( a [ i ]是以* ( a + i )形式表示的)。如果不等于 \0 ,表示字符串尚未處理完,就將a [ i ]的值賦給b [ i ],即復制一個字符。在for循環中將a串中的有效字符全部復制給了b數組。最后還應將\0復制過去,作為字符串結束標志。故有

* ( b + i ) =' \0 ';

在第2個for循環中輸出b數組中的元素,在printf函數中用下標法表示一個數組元素(即一個字符)。也可以用輸出a數組的方法輸出b數組。用以下一行代替程序的10?~13行。

printf ( " string b is : % s\n " , b ) ;

程序中用逐個字符輸出的方法只是為了表示可以用不同的方法輸出字符串。

也可以用另一種方法,用指針變量訪問字符串。通過改變指針變量的值使它指向字符串中的不同字符。

例題4:

用指針變量來處理例3問題。

解題思路:

定義兩個指針變量p1和p2,分別指向字符數組a和b。改變指針變量pl和p2的值,使它們順序指向數組中的各元素,進行對應元素的復制。

編寫程序:

運行結果:

程序分析:?

p1和p2是指向字符型數據的指針變量。先使p1和p2分別指向字符串a和b的第1個字符。*p1最初的值是字母' I '。賦值語句“* p2 = * p1;”的作用是將字符' I ' ( a串中第1個字符)賦給p2所指向的元素,即b[ 0 ]。然后p1和p2分別加1,分別指向其下面的一個元素,直到*p1的值為'\0'止。

注意,p1和p2的值是不斷在改變的,在for語句中的p1 ++和p2++使pl和p2同步移動。

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

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

相關文章

【Linux驅動-快速回顧】一文快速理解GIC內部寄存器對中斷的控制

第一部分:GIC的功能和組成 1. GIC要解決的根本問題 在一個復雜的片上系統(SoC)中,有非常多的硬件模塊(如定時器、串口、按鍵、DMA等),它們都需要在完成任務或遇到特定事件時通知CPU。同時&#…

【IoTDB 線上小課 17】開源 ≠ 免費,3 分鐘總結開源商用指南

【IoTDB 視頻小課】第十七期,解答你最關心的開源商業使用問題!關于 IoTDB,關于物聯網,關于時序數據庫,關于開源...一個問題重點,3-5 分鐘,我們講給你聽:原來開源商業化有這么多規則開…

VUE項目學習筆記 v-for綁定數據,該數據異步獲取,同時需要對v-for的DOM節點進行js操作

問題描述:項目里有一個輪播圖,輪播圖的圖片數據從服務器獲取,用v-for生成DOM在頁面中顯示,輪播圖插件會通過new Swiper給DOM添加CSS、事件等,實現輪播效果。在這里存在操作順序問題:當服務器返回圖片數據后…

Science | 如何利用“T細胞+組蛋白乙酰化”兩大國自然熱點?T細胞耗竭機制與代謝-表觀遺傳調控的新范式

CD8?T細胞耗竭(T cell exhaustion)是腫瘤免疫治療的核心瓶頸,其表觀遺傳重塑機制(如組蛋白修飾)是當前國自然重點資助的前沿方向。耗竭T細胞(TEX)是指在慢性感染(如持續性病毒感染&…

Logback 配置的利器:深入理解<property>與<variable>

在構建現代 Java 應用程序時,日志是不可或缺的一部分。一個健壯的日志系統不僅能幫助我們監控應用程序的運行狀態,還能在問題發生時提供關鍵的診斷信息。Logback 作為 SLF4J 的一個流行實現,以其高性能和靈活的配置而廣受開發者喜愛。 然而&a…

Java中excel字典轉換

? 背景說明EasyExcel 原生的 ExcelProperty 注解不支持 dictType(不像那樣有 Excel(dictType"xxx")),所以如果你想實現字典翻譯功能,就需要自己實現 Converter 接口,比如 DictConvert。? 什么是 DictConve…

數據結構-3(雙向鏈表、循環鏈表、棧、隊列)

一、思維導圖二、雙向循環鏈表的判空、尾插、遍歷(反向)、尾刪class Node:def __init__(self, data):self.data dataself.next Noneself.prior Noneclass circularDoublyLinkedList():def __init__(self):self.head Noneself.tail Noneself.size 0def isEmpty(self):retu…

IDEA運行Tomcat一直提示端口被占用(也查不到該端口)

首先查看是否是因為Java程序異常終止,進程沒有完全釋放導致。打開資源管理器,找到所有的java.exe,強制結束任務。如果仍然不行,那就極可能還是開啟了hyper-V虛擬化,查看排除的tcp端口范圍端口號沒被占用卻提示占用&…

AWS Lambda 最佳實踐:構建高效無服務器應用的完整指南

引言 AWS Lambda 作為無服務器計算的核心服務,讓開發者能夠專注于業務邏輯而無需管理服務器。本文將通過實際案例和代碼示例,分享 Lambda 開發中的關鍵最佳實踐。 1. 函數設計原則 單一職責原則 每個 Lambda 函數應該只做一件事,這樣更容易測試、維護和擴展。 # ? 不推…

29、鴻蒙Harmony Next開發:深淺色適配和應用主題換膚

目錄 應用深淺色適配 應用跟隨系統的深淺色模式 應用主動設置深淺色模式 系統默認判斷規則 使用建議與限制 設置應用內主題換膚 概述 自定義主題色 設置應用內組件自定義主題色 設置應用局部頁面自定義主題風格 設置應用頁面局部深淺色 系統缺省token色值 應用深淺…

源鑒SCA4.9︱多模態SCA引擎重磅升級,開源風險深度治理能力再次進階

SCA技術已成為數字供應鏈開源治理的關鍵入口。源鑒SCA深度融合懸鏡原創專利級AI智能代碼疫苗技術,是國內首款集源碼組件成分分析、代碼成分溯源分析、制品成分二進制分析、容器鏡像成分掃描、運行時成分動態追蹤及開源供應鏈安全情報預警分析等六大核心引擎為一體的…

Git語義化提交規范及提交模板設置

Git語義化提交規范(Conventional Commits) 📚 常見的語義化提交類型包括:類型含義說明feat? 新增功能(feature)fix🐛 修復 bugdocs📚 修改文檔(如 README)st…

用TensorFlow進行邏輯回歸(五)

Softmax分類#List3-50%matplotlib inlineimport numpy as npimport tensorflow as tfimport matplotlib.pyplot as pltx1_label0 np.random.normal(1, 1, (100, 1))x2_label0 np.random.normal(1, 1, (100, 1))x1_label1 np.random.normal(5, 1, (100, 1))x2_label1 np.ran…

基于 Django + 協同過濾算法的電影推薦系統設計與實現

🎬 基于 Django 協同過濾算法的電影推薦系統設計與實現?? 本項目由成都理工大學宜賓校區的三位同學曾銘楊、楊皓麟、陳禧錦共同完成。項目以豆瓣電影數據為基礎,通過協同過濾算法為用戶構建個性化電影推薦服務,是一款集數據爬取、推薦算法…

小白全棧項目部署指南

小白全棧項目部署指南:前端后端數據庫完整攻略 📖 寫在前面 當你學會了基礎的靜態網站部署后,是不是想挑戰更有趣的項目?比如一個能夠注冊登錄、保存數據的完整應用? 這就需要學習全棧項目部署了! 別被&quo…

C# Linq 左關聯查詢詳解與實踐

在 C# 開發中,Linq(Language Integrated Query)提供了強大的數據查詢能力,尤其是在處理集合間的關聯操作時。本文將詳細解析 C# Linq 中的左關聯查詢,并通過實際案例說明其用法。左關聯查詢基礎左關聯(Left…

【機器學習深度學習】LoRA 微調詳解:大模型時代的高效適配利器

目錄 前言 一、LoRA 的核心思想 二、LoRA 為什么高效? ? 1. 參數效率 ? 2. 內存友好 ? 3. 即插即用 三、LoRA 適用場景 四、LoRA 實踐建議 五、LoRA 和全參數微調對比 六、 LoRA的具體定位 📌 總結 🔗 延伸閱讀 前言 在大模型…

vue頁面不銷毀的情況下再返回,總是執行created,而不觸發 activated

vue頁面不銷毀的情況下再返回,總是執行created,而不觸發 activated 原因: 沒有進行頁面緩存地址和頁面組件的name沒對上 解決方案: 組件只有在被 包裹時才會觸發 activated 和 deactivated 生命周期 如果沒有被緩存,每次進入路由…

從 C# 到 Python:6 天極速入門(第二天)

作為一名資深 C# 開發者,我們在第一天已經掌握了 Python 的基礎語法框架。今天我們將深入 Python 的特色語法與高級特性,通過實際項目開發場景的代碼對比,理解這些特性在真實業務中的應用價值。一、簡潔語法糖:項目開發中的實戰應…

MyBatis 動態 SQL:讓 SQL 語句隨條件靈活變化

目錄 1. 動態SQL 1.1. if 1.1.1. 持久層接口添加方法 1.1.2. 映射文件添加標簽 1.1.3. 編寫測試方法 1.2. where 1.3. set 1.4. choose、when、otherwise 1.5. foreach 1.5.1. 遍歷數組 1.5.2. 遍歷Collection 1.5.3. 遍歷Map 2. 總結 前言 本文來講解MyBatis的動…