玳瑁的嵌入式日記D13-0806(C語言)

指針


1.指針


指針 就是地址
(地址就是內存單元的編號)

指針變量?
(結合語境)?
eg:
定義一個指針
指針這一類數據 --- 數據類型 --- 指針類型?
(1).指針 是什么?
(2).指針類型?

? ?int a; //int數據類型 a是int型變量?
//a的空間 想來存儲 整型數據?

?? ? ?

2.指針的定義?


基類型 * 指針變量名;

int a = 10;
int *p = &a;
指針變量本身 ? ? ? // p ? ? ?
指針變量指向的目標 ?// a
begin ? //指針變量本身 --- 放的是一個地址?
*begin ?//基類型 ?

3.指針間接訪問?


通過指針來使用內存空間?

*p?
step1:拿p中的值 到內存中定位?
step2:從定位處開始,偏移sizeof(基類型)大小一塊空間
step3:將這塊空間當做一個基類型(變量/數據)來看?


*p <=> a

4. 指針用途?
函數帶出多個參數?
操作硬件?
函數參數?

核心:
被調? ? ? ? 修改? ? ? ? ? 主調?
實現的兩個要素:
a.要修改誰,傳誰的地址 ?//拿到地址 --只是知道在哪兒呢??
b.被調函數中,要有對應*p這種運算 //如何用-- 用?


5.指針使用數組?


整型一維數組?


(1).指針運算?
指針 + 1 ?//

指針 相減 ---減出來的 數據是個整型數據?
差了多少基類型

指針 關系運算?
(2).指針能夠操作數組?
a.數組的特點
b.只需要獲得首元素地址即可?


指針 + 字符型數組

char s[10] = "hello"; ?//字符串 --- 存放在棧空間?
// 堆區 ?也可以放?
// 全局?
// 字符串常量區

char *p = "hello"; //字符串常量 --沒有數組名的數組 ??? ??? ??? ??? ??? ? ??


char *p = s;
s[0] ? //char?
&s[0] ?//char *?
說明:
指針代表的位置 ---地址的含義 ---說明在哪里
先用對應的空間 --- *p?


區分(考點)


char s[] = "hello"; ?//s本身的空間在棧上 ,"hello"本身是字符串常量,存放字符串常量區
//用字符串常量區中 "hello" 初始化了 棧上s的空間

//注意: s[0] = 'h'; (正確) --- 棧上的空間可讀可寫?? ???

? ? ? ? ? ? ? ? ? ? ? ?有兩個“hello”,一個在常量區,一個在棧上


char *s = "hello"; ? //s本身的空間在棧上,s是char*的指針變量,用來存放一個 char *的地址?
//"hello"本身是字符串常量,存放字符串常量區
//"hello"字符串都是按字符數組的方式存儲的?
//相當于是一個匿名數組 ---- 獲得的還是首元素的地址
//注意: s[0] = 'h'; (錯誤) ---常量區空間不能修改 ?? ??? ??

? ??? ??? ??? ? ??
const


const char * s = "hello";
int a; ? ? ? ?//變量 ?--可讀可寫?
const int a; ?//只讀變量 -- 只讀

const 本身的作用 : 限定為只讀?


?const char * s; //const 用來修飾基類型 ?--- 限定基類型為只讀 ---只是說,不能通過*p 修改,相當于限定了*p為只讀
char const * s; //const 用來修飾基類型 ?--- 限定基類型為只讀?

char const *s(等價于?const char *s

  • 含義:指向常量字符的指針

    • const?修飾的是?char,表示指針?s?所指向的字符是?不可修改的(常量)。
    • 但指針?s?本身是?可以改變指向的(可以指向其他字符)。

?char * const s; ?//const 用來修飾指針變量本身 --- 將指針變量本身限定為只讀---指針變量本身不能被修改?



?const char const *s; //指針變量 本身不能被修改?
//*s 也不能被修改 ??

char *const s

  • 含義:指向字符的常量指針

    • const?修飾的是指針?s?本身,表示指針?s?的?指向是固定的(不能改變)。
    • 但指針?s?所指向的字符是?可以修改的

?const 修飾指針的時候:
區分
修飾指針變量本身?
修飾基類型?
?規則:
距離誰近 就修飾誰
就近原則
?

說明:
1.const 可以將運行錯誤提前?
2.const 修飾函數的形參?
a.提高了參數的適用性?
//數組名?
//char *
//const char *
b.防止函數誤操作?
建議,能寫成const 都寫成const
void Puts(char *s)
void Puts(const char *s) ?
int puts(const char *s); //const 什么時候,如果函數中只是用數據,而不涉及修改操作,一般都建議寫成const?


練習:
strlen?
int Strlen(const char *s)
{
}



練習:
strcpy?

char *Strcpy(char *dest, const char *src)
{ ? ??
char *ret = dest;
拷貝?
return ret;
}

? ?返回值 ?返回值 dest?


char *Strncpy(char *dest, const char *src, size_t n)
{
char *ret = dest;
//始終拷貝了n次?
// n < 字符串長度 那么n次拷完 就結束?
// n > 字符串長度 字符串拷貝完成, n剩余的次數還要拷貝 --- 拷貝的是 0
return ret;
}

n 表示 將src的前n個字符拷貝到dest中?
將前n個字符拷貝到dest中,但是如果前n個中沒有 '\0' 那dest中也不會后?

n 大于 字符串長度 保證n次 拷貝夠?
剩余的次數 通通拷貝 0


練習:
strcat?

char *Strcat(char *dest, const char *src)
{ ? ?
//1.定位到dest 的 '\0'位置?
//2.拷貝?
//3.保證 dest 是字符串 ? ??
}

//將src中前n個字符拼接到dest中
char *strncat(char *dest, const char *src, size_t n);
{
//1.定位到dest 的 '\0'位置?
//2.拷貝?
//n < strlen(src) ?前n字符拼接完 就結束 --- 最后保證是字符串 --dest最后要加'\0'
//n > strlen(src) ?將src拼接完成 就結束 --- 最后保證是字符串 --dest最后要加'\0'
//3.保證 dest 是字符串 ? ?
}


練習:
strcmp

int Strcmp(const char *s1, const char *s2)
{
從左到右 逐個比?
遇到不同的 或者 '\0'

}
//表示 比較 s1 和 s2 前n個字符?
//hello
//help

int Strncmp(const char *s1, const char *s2, size_t n)
{

}

小結:
1.語法 --- 指針要操作數組 只需要獲得首元素的地址?
2.字符串 --- 字符串有結束標志?
3.棧上的字符串
常量區中的字符串?



指針 + 二維數組?

指針 + 整型二維?

int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

指針要操作數組 只需要獲得首元素的地址?

? * p?
二維數組的本質:
int[4] a[3];? ? ? ? ? ?//元素類型 int[4] //a[0]
二維數組中首元素?
a[0]? ? ? ? ? ? ?// 首元素的數據類型 ---int[4]?
&a[0]? ? ? ? ? ? ? ? ?// int[4] * ? //指針類型?


int[4] *p; //理解沒問題?

int (*p) [4]; //表示定義了一個指針 指向int[4]這種類型?
//指向的目標是個數組類型 --- 數組指針

?? ??? ??? ? ?

*(p+1) <=> a[1] //表示可以用一整行的空間 ?
//a[1] <=> *(p+1)
//a[1] 相當于是 內部的 一整行數組的 數組名 (*(p+1))
// ?數組名 代表的類型 ?整個數組大小 ? ?// int[4]這種類型
// ?數組名 代表的值 ? 首元素的地址 ? ?// &a[1][0]
// ? ? ? 地址的類型 --- int *

*(p+1) ?//代表 ?第 1 行的首元素的地址?

*(p+1) + 1 ? // 第1行 第1列 元素的地址?
*(*(p+1) + 1) // ?第1行 第1列 的 元素 //變量?


二維數組 ,通過指針訪問數組元素:

p+i ? ? ??? ??? ?//第i行的 地址?
*(p+i) ? ??? ??? ?//第i行的 首元素 的地址 ?--- 內部的一維數組的數組名?
*(p+i)+j ??? ??? ?//第i行的 第j列 元素的地址
*(*(p+i)+j) ??? ?//第i行 第j列 的元素

//訪問到二維數組元素的方式:
*(*(p+i)+j)?
*(p[i]+j)
*(*(p++)+j)
*(*(a++)+j) //數組名 --- 代表首元素地址 --- 地址常量 a 是個常量, a++ 不能做?
*(a[i]+j)?
-----------------------------------------------------------------

練習:
實現一個函數 找出數組中最大值?

指針 + 字符二維數組?
char s[3][10] = {"hello","world","china"};

char (*p)[10] = s;

練習:
實現一個輸入函數,可以從鍵盤輸入字符串?

void scanfStr(char (*s)[10],int row)
{

}
練習:
//找最大值?



作業:

1. 編寫一個程序實現功能:
將字符串”Computer Science”賦給一個字符數組,
然后從第一個字母開始間隔的輸出該字符串,用指針完成。
"Cmue cec"



2. 編寫程序實現單詞的倒置
"how are you" -> "you are how"

//char s1[] = "how";

3. 封裝一個函數,統計一個字符串中出現指定單詞的個數
int WordCnt(char *pStr, char *pWord)
{
}
"fdsahelfdashellofdashellofdashellofdashellohello"
"hello"

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

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

相關文章

密碼學基礎知識總結

密碼學基礎知識總結 一、Base編碼 1. Base系列特征 編碼類型字符集特征Base160-9, A-F密文長度偶數Base32A-Z, 2-7包含數字2-7Base64a-z,0-9,,/,密文長度是8的倍數Base36A-Z,0-9僅支持整數加密Base910-9,a-z,A-Z,特殊符號高密度編碼Base100Emoji表情表情符號組成 2. 典型題型…

PostgreSQL 中 pg_wal文件過多過大的清理方法及關鍵注意事項的總結

PostgreSQL 中 pg_wal文件過多過大的清理方法及關鍵注意事項的總結 以下是針對 PostgreSQL 中 pg_wal 文件過多過大的清理方法及關鍵注意事項的總結 一、安全清理 WAL 文件的完整流程 1. 確認數據庫和備份完整性 備份驗證&#xff1a;確保最近的物理備份&#xff08;如 pg_base…

Django事務支持

1.事務概念 事務是一組不可分割的操作序列&#xff0c;這些操作要么全部執行&#xff0c;要么全部不執行。事務具有四個關鍵屬性&#xff0c;通常稱為 ACID 特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事務是一個不可分割的工作單位&#xff0c;事務…

<form> + <iframe> 方式下載大文件的機制

使用 <form> <iframe> 方式下載大文件的機制之所以穩定&#xff0c;核心在于其?分塊傳輸?和?瀏覽器沙箱隔離?設計。以下是技術原理詳解&#xff1a; 一、底層工作機制 ?分塊傳輸協議? 表單提交后&#xff0c;服務器按 Transfer-Encoding: chunked 分塊返回數…

Python--OCR(2)

一、明確 OCR 任務邊界首先定義 OCR 系統的核心目標&#xff1a;場景&#xff1a;印刷體&#xff08;如文檔、發票&#xff09;/ 手寫體&#xff08;如筆記&#xff09;/ 特定場景&#xff08;如車牌、身份證&#xff09;輸入&#xff1a;圖像格式&#xff08;JPG/PNG&#xff…

基于Django的計算機資源爬蟲及可視化系統的設計與實現

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主一、項目背景二、項目目標三、系統架構與技術選型四、系統功能模塊五、應用場景與價值六、項目特色與創新點七、總結每文一語有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試…

SH3001六軸傳感器應用(二)(IIC驅動開發)

一、前言我這邊使用的開發板原本已經做好了該sensor的驅動&#xff0c;但是使用過程中發現&#xff0c;原始驅動sensor是通過事件的方式上報的&#xff0c;加速度和陀螺儀數據并不同步&#xff0c;不滿足使用要求&#xff0c;只有重新寫一個iic的驅動&#xff0c;進行sensor數據…

面試題:基礎的sql命令

基礎的 SQL 命令主要用于對數據庫進行查詢、新增、修改、刪除等操作&#xff0c;可分為以下幾類&#xff1a;一、數據查詢&#xff08;SELECT&#xff09;用于從表中獲取數據&#xff0c;是最常用的命令。 基本語法&#xff1a;SELECT 列名1, 列名2... FROM 表名 WHERE 條件;示…

Leetcode-3488距離最小相等元素查詢

依舊二分&#xff0c;鏈接如下3488. 距離最小相等元素查詢 看題目是個循環數組&#xff0c;記得當時做過一道什么題也是循環數組&#xff0c;就想著直接數組復制一下&#xff0c;然后跟上一道題一樣&#xff0c;用hashmap來存儲value的值以及value對應下標的vector。 和靈神的…

C++中的關聯容器

文章目錄使用關聯容器定義關聯容器關鍵字類型的要求pair類型用作返回類型關聯容器上的操作關聯容器的迭代器關聯容器和算法添加元素刪除元素map的下標操作訪問元素無序容器對關鍵字的要求關聯容器支持高效的關鍵字查找和訪問。兩個主要的關聯容器的類型是map和set。其中map中的…

【Git】git提交代碼報錯Git: husky > pre-commit

git提交代碼報錯原因 這個問題是因為當你在終端輸入git commit -m “XXX”,提交代碼的時候,pre-commit(客戶端)鉤子&#xff0c;它會在Git鍵入提交信息前運行做代碼風格檢查。如果代碼不符合相應規則&#xff0c;則報錯&#xff0c;而它的檢測規則就是根據.git/hooks/pre-commi…

Unity開發者快速認識Unreal 的C++(六)GameMode之PlayerController

繼承關系&#xff1a;Aactor&#xff0c;INavAgentInterface <--- AController<--- PlayerController &#xff0c;PlayerController也是一個Actor,繼承了Actor的一些通用的屬性和工具函數下圖是PlayerController初始化組件的一個子階段從圖中可以得到的信息是&#xf…

Vue 3 服務端渲染(SSR)與客戶端渲染(CSR)的區別及解決方案

1. SSR與CSR的區別1.1. SSR的原理服務端渲染&#xff08;SSR&#xff09;是在服務器端將 Vue 組件渲染為 HTML 字符串&#xff0c;并將其發送給客戶端。這種方式與客戶端渲染&#xff08;CSR&#xff09;不同&#xff0c;后者是在瀏覽器中執行 JavaScript 來生成 HTML。在 SSR …

Matlab快速回顧

一1.數值 顯示 格式format style 設置eg: pi format longE;or2.清除指令clc 清除命令行窗口clear 清除工作區cls3.搜索路徑設置path(path,E:\ads\)oraddpath4.M文件用戶把要實現的命令寫在一個以.m為擴展的文件中&#xff0c;然后由matlab系統進行解讀&#xff0c;最后運行結果…

開源低代碼+AI引擎:百特搭企業級開發平臺的演進

在數字化轉型進入深水區的今天&#xff0c;企業應用開發面臨前所未有的復雜挑戰&#xff1a;既要快速響應業務需求&#xff0c;又要確保系統靈活可控&#xff1b;既要降低技術門檻&#xff0c;又要保障核心安全。傳統開發模式與單一形態的低代碼工具已難以滿足多層次需求。融合…

學習 Android(十五)NDK進階及性能優化

學習 Android&#xff08;十五&#xff09;NDK進階及性能優化 對 NDK 相關知識有了初步的了解之后&#xff0c;我們可以更加深入的去學習 NDK 相關知識&#xff0c;接下來&#xff0c;我們將按照以下步驟進行深入學習&#xff1a; 深入理解JNI調用過程和性能消耗常見 JNI 坑&am…

QT5.12.8 QTabWidget 透明樣式QSS

/* 設置QTabWidget本身 :不加也行*/ QTabWidget#aaa_tabwdt {background: transparent;border: none; /* 移除邊框可能有助于透明效果 */ }/* 標簽頁內的容器部件 :必須加&#xff0c;標簽也才會透明 */ QTabWidget#aaa_tabwdt QWidget, QTabWidget#aaa_tabwdt QFrame {backgro…

【FAQ】Script導出SharePoint 目錄文件列表并統計大小

一、只導出文件列表的方法 1) 保存腳本&#xff08;建議名&#xff1a;D:\tmp\Export-SharePoint-FileList.ps1&#xff09; <# 導出 SharePoint 指定文件夾&#xff08;含子文件夾&#xff09;的文件列表到 CSV&#xff08;不統計大小&#xff09; 前提&#xff1a;已安…

《Thinking in Java》讀書筆記---控制執行流程

就像有感知的生物一樣&#xff0c;程序必須在執行過程中控制它的世界&#xff0c;并做出選擇。在Java中&#xff0c;你要使用執行控制語句來作出選擇。一、流程控制基礎概念1.1 流程控制的重要性流程控制結構決定了程序執行的順序和邏輯分支&#xff0c;是編程語言中最基礎也是…

極驗 G-star 人才特訓營:為業務安全領域培養下一代新興力量

本文導讀 極驗為什么要啟動 G-star 實習生培養計劃&#xff1f;50多位來自多所高校的同學&#xff0c;在極驗經歷了一場怎樣的“非典型”實習&#xff1f;技術大咖親授&#xff0c;先培訓再實戰&#xff0c;極驗打造的是怎樣的人才體系&#xff1f;同學有話說&#xff1a;培養計…