深入理解c指針(四)

目錄

六、assert斷言

七、指針的使用和傳址調用

1、strlen的模擬實現

2、傳值調用和傳址調用

3、練習-字符串逆序?


在深入理解c指針(三)提到,在實際使用指針前可以檢測其是否指到有效空間:

#include<stdio.h>
int main()
{int a = 10;int* p = &a;//...//...p = NIULL;//...//...if (p != NULL){//...}return 0;
}

六、assert斷言

? ? ? ?assert.h 頭文件定義了宏 assert() ,用于在運行時確保程序符合指定條件,如果不符合,就報
錯終止運行。這個宏常常被稱為“斷言”。

? ? ? ? 下面代碼當程序運行到這一行語句時,驗證變量 p 是否等于 NULL 。如果確實不等于NULL,程序繼續運行。否則結果為假就會終止運行,并且給出報錯信息提示。甚至提示在哪個路徑下哪個文件的哪一行出現錯誤。

#include<stdio.h>
#include<assert.h>
int main()
{int a = 10;int* p = &a;//...//...p = NULL;assert(p != NULL);return 0;
}

? ? ? assert()的使用對程序員是非常友好的,使用assert()有幾個好處:它不僅能自動標識文件和出問題的行號,還有一種無需更改代碼就能開啟和關閉assert()的機制。

? ? ? 如果已經確認程序沒有問題,不需要再做斷言,就在?#include<assert.h> 語句的前面,定義一個宏 NDEBUG,然后重新編譯程序,編譯器就會禁用文件中所有的assert()語句。如果程序又出現問題,可以移除#define NDEBUG 指令(或者注釋掉),再次編譯,再次編譯這樣就重新啟用了assert()語句。??

#define NDEBUG
#include <assert.h>
#include <stdio.h>
int main()
{int a = 10;int* p = &a;//...//...p = NULL;assert(p != NULL);return 0;
}

七、指針的使用和傳址調用

1、strlen的模擬實現

2、傳值調用和傳址調用

#include <stdio.h>
void Swap1(int x, int y)
{int tmp = x;x = y;y = tmp;
}
int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("交換前:a=%d b=%d\n", a, b);Swap1(a, b);printf("交換后:a=%d b=%d\n", a, b);return 0;
}

發現其實沒產生交換的效果,我們發現在main函數內部,創建了 a 和 b,a 的地址是0x00cffdd0,b 的地址是0x00cffdc4,在調用Swap1函數時,將 a 和 b 傳遞給了Swap1函數,在Swap1函數內部創建了形參x和y接收a和b的值,但是x的地址是0x00cffcec,y的地址是0x00cffcf0,x和y確實接收到了a和b的值,不過x的地址和a的地址不?樣,y的地址和b的地址不?樣,相當于x和y是獨立的空間,那么在Swap1函數內部交換x和y的值,自然不會影響 a 和 b,當Swap1函數調用結束后回到main函數,a 和 b 的沒法交換。Swap1函數在使用的時候,是把變量本身直接傳遞給了函數,這種調用函數的方式我們之前在函數的時候就知道了,這種叫傳值調用

結論:實參傳遞給形參時,形參會單獨創建?份臨時空間來接收實參,對形參的修改不影響實參。


? ? ? ? ?我們現在要解決的就是當調用Swap函數的時候,Swap函數內部操作的就是main函數中的a和b,直接將 a 和 b 的值交換了。那么就可以使用指針了,在main函數中將 a 和 b 的地址傳遞給Swap函數,Swap函數里邊通過地址間接的操作main函數中的 a 和 b,并達到交換的效果就好了。

?

3、練習-字符串逆序?
#include<stdio.h>
#include<string.h>
void Reverse(char* str)
{char* left = str;char* right = str + strlen(str)-1;while(left < right){char temp = *left;*left = *right;*right = temp;++left;--right;}
}int main()
{char str[] = "hello bit";Reverse(str);return 0;
}// 注意:如果是在線OJ時,必須要考慮循環輸入,因為每個算法可能有多組測試用例進行驗證,參考以下main函數寫法,
int main()
{char str[101] = {0};while(gets(str)){Reverse(str);printf("%s\n", str);memset(str, 0, sizeof(str)/sizeof(str[0]));}return 0;
}

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

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

相關文章

度量與評估客戶體驗:以客戶為中心的方法和工具

在當今的市場環境中&#xff0c;客戶體驗已經成為企業成功的關鍵因素。一個優秀的客戶體驗不僅能夠提升客戶滿意度&#xff0c;增強客戶忠誠度&#xff0c;還能夠吸引新的潛在客戶。然而&#xff0c;要實現這一目標&#xff0c;企業首先需要了解如何度量和評估客戶體驗。本文將…

day08_分類品牌管理商品規格管理商品管理

文章目錄 1 分類品牌管理1.1 菜單添加1.2 表結構介紹1.3 頁面制作1.4 品牌列表加載1.4.1 后端接口BrandControllerBrandServiceBrandMapperBrandMapper.xml 1.4.2 前端對接brand.jscategoryBrand.vue 1.5 分類數據加載1.6 列表查詢1.6.1 需求說明1.6.2 后端接口需求分析Categor…

linux nasm匯編中調用printf不報錯,但調用scanf報錯。拋出了分段錯誤(核心轉儲)

當我寫了如下匯編時 ; nasm -f elf64 -g -F dwarf charsin.asm ; gcc charsin.o -no-pie -o charsin ; ld -o eatclib eatclib.o ; gdb eatclib[SECTION .data]SPrompt db Enter string data, followed by Enter: ,0IPrompt db Enter an integer value, followed by Enter: ,1…

Python進階教學一

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、函數1.高階函數2.返回函數3.匿名函數4.裝飾器 二、實例1.類和實例2.限制訪問3. 繼承和多態4.實例屬性和類屬性 一、函數 1.高階函數 1.1 map1.2 reduce1.3 fi…

Dsco Dropship EDI需求分析

供應商要想從Dsco處通過EDI獲取訂單&#xff0c;需要部署自己的EDI系統&#xff0c;與Dsco的EDI供應商CommerceHub 建立連接&#xff0c;分為兩個方向&#xff1a; 1.從CommerceHub 的 Dsco 平臺獲取 EDI 850 采購訂單 2.向Dsco發送庫存&#xff08;846&#xff09;、訂單狀態…

MySQL的內外連接

1.內連接 內連接實際上就是利用 WHERE 子句&#xff08;連接條件&#xff09;對兩張表形成的笛卡爾積&#xff08;內連接&#xff09;進行篩選&#xff0c;我們之前學習的查詢基本都是內連接&#xff0c;也是在實際生產中被使用得最多的連接查詢。 另外內連接還可以使用下面的…

Java Swing游戲開發學習7

內容來自RyiSnow視頻講解 這一節實現的是背景音樂和音效的播放。 在這里&#xff0c;背景音樂和音效所用的音頻文件均為wav格式文件。Java SDK默認支持的格式有限&#xff0c;默認不支持mp3格式音樂。 背景音樂、拾取鑰匙、拾取靴子、開門分別有對應的音頻文件。 作者的實現…

2024-02學習筆記

1.當我們向Set集合中添加一個已經存在的元素時 當我們向Set集合中添加一個已經存在的元素時&#xff0c;Set集合會如何處理呢&#xff1f;實際上&#xff0c;Set集合不會將重復的元素添加到集合中。當我們向Set集合中添加一個元素時&#xff0c;Set集合會首先判斷該元素是否已…

Ubuntu-22.04安裝MegaCLI并查看MegaRAID的配置

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、MegaRAID二、安裝MegaCLI1.Ubuntu-18.042.Ubuntu-22.043.Ubuntu-20.044.CentOS-75.其它發行版 三、使用MegaCLI1.查看所有適配器信息2.查看所有物理磁盤信息…

華為配置WLAN高密業務示例

配置WLAN高密業務示例 組網圖形 圖1 配置高密WLAN環境網絡部署組網圖 業務需求組網需求數據規劃配置思路配置注意事項操作步驟配置文件 業務需求 體育場由于需要接入用戶數量很大&#xff0c;AP間部署距離較小&#xff0c;因此AP間的干擾較大&#xff0c;可能導致用戶上網網…

新王炸:文生視頻Sora模型發布,能否引爆AI芯片熱潮

前言 前方高能預警&#xff0c;Sora來襲&#xff01; 淺析Sora的技術亮點 語言模型中構建關鍵詞聯系 視頻素材分解為時空碎片 擴散模型DiT Not for play, But change world! OpenAI的宏大目標 未來已來&#xff0c;只是尚未流行 Sora的成本與OpenAI的7萬億美金豪賭 算…

【探索AI】人人都在講AIGC,什么是AIGC?

AIGC 概述示例展示我們日常用到的一些工具/應用核心技術介紹核心技術的算法解析案例及部分代碼實現1. 藝術作品2. 設計項目3. 影視特效4. 廣告創意總結 一張圖先了解下&#xff1a; 概述 "人工智能生成創造&#xff08;Artificial Intelligence Generated Content&#x…

從CPU緩存結構到原子操作

一、CPU緩存結構 1.1 CPU的多級緩存 因為CPU的計算速度非常快&#xff0c;但內存的訪問速度相對較慢。因此&#xff0c;如果CPU每次都要從內存讀取數據&#xff0c;會造成大量的等待時間&#xff0c;降低整體性能。 通過引入多級緩存&#xff0c;可以在CPU和內存之間建立數據…

vue3中實現elementPlus表格選中行的上移下移

先看效果&#xff1a; 實現步驟&#xff1a; 1、給el-table添加current-change事件、高亮屬性及ref屬性 2、給上移下移按鈕添加事件 // 定義當前選中的行參數 const currentRow ref<any>(null); // 定義表格的ref const singleTableRef ref(); // 行選中事件 const ha…

正信晟錦:借了錢的人一直不接電話不回信息咋辦

在金錢往來中&#xff0c;遇到借出的錢款無法按時回收&#xff0c;且借款人如同人間蒸發一般不接電話、不回信息&#xff0c;確實讓人焦慮。面對這種情形&#xff0c;我們需采取明智而有效的措施&#xff0c;以保護自身的權益。 首要策略是保持冷靜&#xff0c;不要讓情緒主導行…

四、《任務列表案例》后端程序實現和測試

本章概要 準備工作功能實現前后聯調 4.1 準備工作 數據庫腳本 CREATE TABLE schedule (id INT NOT NULL AUTO_INCREMENT,title VARCHAR(255) NOT NULL,completed BOOLEAN NOT NULL,PRIMARY KEY (id) );INSERT INTO schedule (title, completed) VALUES(學習java, true),(學…

【前端素材】推薦優質在線高端蜂蜜商城電商網頁Beejar平臺模板(附源碼)

一、需求分析 1、系統定義 在線高端蜂蜜商城是指一個專門銷售高品質、高端蜂蜜產品的電子商務平臺。這種商城致力于向消費者提供各種經過精心挑選、具有高營養價值和健康功效的蜂蜜產品。 2、功能需求 在線高端蜂蜜商城是指一個專門銷售高品質、高端蜂蜜產品的電子商務平臺…

Go字符串實戰操作大全!

目錄 1. 引言文章結構概覽 2. Go字符串基礎字符串的定義與特性什么是字符串&#xff1f;Go字符串的不可變性原則 字符串的數據結構Go字符串的內部表達byte和rune的簡介 3. 字符串操作與應用3.1 操作與應用字符串連接字符串切片字符串查找字符串比較字符串的替換字符串的大小寫轉…

vos3000外呼系統警告消除怎么設置

你有沒有發現vos3000登陸時老是提示告警&#xff0c;消除一會又出現&#xff0c;那么又什么辦法能解決呢&#xff1f;要徹底消除 VOS3000 系統的警告&#xff0c;一般需要通過以下步驟來進行排查和解決&#xff1a; 確認警告信息&#xff1a;首先要明確警告的具體內容和出現的條…

舊的Spring Security OAuth已停止維護,全面擁抱最新解決方案Spring SAS

Spring Authorization Server 替換 Shiro 指引 背景 Spring 團隊正式宣布 Spring Security OAuth 停止維護&#xff0c;該項目將不會再進行任何的迭代 目前 Spring 生態中的 OAuth2 授權服務器是 Spring Authorization Server 已經可以正式生產使用作為 SpringBoot 3.0 的最新…