FreeRTOS-C語言指針筆記

文章目錄

  • 一級指針
    • 指針基本概念
    • 指針使用示例
    • 代碼說明
  • 二、二級指針
    • 二級指針重點解析

一級指針

C語言中的指針是一個非常重要的概念,它存儲了變量的內存地址。指針的使用可以使程序更加高效,尤其在處理數組、字符串和動態內存分配時。

指針基本概念

  • 指針變量:用于存儲內存地址的變量
  • 取地址符 &:獲取變量的內存地址
  • 解引用符 *:訪問指針所指向地址的內容

指針使用示例

下面是一些常見的指針使用示例:
可以運行

#include <stdio.h>// 1. 基本指針操作
void basicPointerExample() {int num = 10;int *p;       // 聲明一個int類型的指針p = &num;     // 將num的地址賦值給指針pprintf("num的值: %d\n", num);printf("num的地址: %p\n", &num);printf("指針p存儲的地址: %p\n", p);printf("指針p指向的值: %d\n", *p);*p = 20;      // 通過指針修改num的值printf("修改后num的值: %d\n", num);
}// 2. 指針作為函數參數(實現值的交換)
void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}// 3. 指針與數組
void pointerAndArray() {int arr[] = {1, 2, 3, 4, 5};int *p = arr;  // 數組名本身就是第一個元素的地址printf("\n數組元素: ");for(int i = 0; i < 5; i++) {// 以下兩種方式等價printf("%d ", *(p + i));// printf("%d ", arr[i]);}printf("\n");
}// 4. 指針與字符串
void pointerAndString() {char *str = "Hello, World!";  // 字符串指針printf("\n字符串內容: ");// 使用指針遍歷字符串while(*str != '\0') {printf("%c", *str);str++;  // 指針自增,指向 next 字符}printf("\n");
}// 5. 指針數組
void pointerArray() {char *names[] = {"Alice", "Bob", "Charlie", "David"};printf("\n指針數組中的字符串: ");for(int i = 0; i < 4; i++) {printf("%s ", names[i]);}printf("\n");
}int main() {basicPointerExample();int x = 100, y = 200;printf("\n交換前: x = %d, y = %d\n", x, y);swap(&x, &y);printf("交換后: x = %d, y = %d\n", x, y);pointerAndArray();pointerAndString();pointerArray();return 0;
}

代碼說明

  1. 基本指針操作:展示了如何聲明指針、獲取變量地址、通過指針訪問和修改變量值
  2. 指針作為函數參數:通過指針在函數內部修改外部變量的值,實現了兩個數的交換
  3. 指針與數組:數組名本質上是指向第一個元素的指針,演示了如何通過指針訪問數組元素
  4. 指針與字符串:字符串可以用指針表示,演示了如何通過指針遍歷字符串
  5. 指針數組:數組中的每個元素都是指針,這里用指針數組存儲多個字符串

指針的使用需要特別注意避免空指針、野指針等問題,這些可能會導致程序崩潰或不可預期的行為。正確使用指針可以使C程序更加靈活和高效。

二、二級指針

在C語言中,二級指針是指向指針的指針,它存儲的是另一個指針變量的地址。二級指針在處理指針數組、動態二維數組以及需要修改指針本身的場景中非常有用。

下面在原有代碼基礎上添加二級指針的使用示例:

#include <stdio.h>
#include <stdlib.h> // 用于動態內存分配// 1. 基本指針操作
void basicPointerExample() {int num = 10;int *p;       // 聲明一個int類型的指針p = &num;     // 將num的地址賦值給指針pprintf("num的值: %d\n", num);printf("num的地址: %p\n", &num);printf("指針p存儲的地址: %p\n", p);printf("指針p指向的值: %d\n", *p);*p = 20;      // 通過指針修改num的值printf("修改后num的值: %d\n", num);
}// 2. 指針作為函數參數(實現值的交換)
void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}// 3. 指針與數組
void pointerAndArray() {int arr[] = {1, 2, 3, 4, 5};int *p = arr;  // 數組名本身就是第一個元素的地址printf("\n數組元素: ");for(int i = 0; i < 5; i++) {// 以下兩種方式等價printf("%d ", *(p + i));// printf("%d ", arr[i]);}printf("\n");
}// 4. 指針與字符串
void pointerAndString() {char *str = "Hello, World!";  // 字符串指針printf("\n字符串內容: ");// 使用指針遍歷字符串while(*str != '\0') {printf("%c", *str);str++;  // 指針自增,指向 next 字符}printf("\n");
}// 5. 指針數組
void pointerArray() {char *names[] = {"Alice", "Bob", "Charlie", "David"};printf("\n指針數組中的字符串: ");for(int i = 0; i < 4; i++) {printf("%s ", names[i]);}printf("\n");
}// 6. 二級指針使用示例
void doublePointerExample() {int num = 100;int *p = &num;    // 一級指針,指向numint **pp = &p;    // 二級指針,指向指針pprintf("\n=== 二級指針基本操作 ===\n");printf("num的值: %d\n", num);printf("p指向的值: %d\n", *p);printf("pp指向的指針所指向的值: %d\n", **pp);printf("num的地址: %p\n", &num);printf("p存儲的地址: %p\n", p);printf("pp存儲的地址: %p\n", pp);printf("p本身的地址: %p\n", &p);
}// 7. 二級指針與指針數組
void doublePointerAndPointerArray() {char *languages[] = {"C", "Python", "Java", "JavaScript"};char **pp;  // 二級指針,用于指向指針數組元素printf("\n=== 二級指針訪問指針數組 ===\n");// 二級指針遍歷指針數組pp = languages;  // 指向數組首元素for(int i = 0; i < 4; i++) {printf("語言: %s, 地址: %p\n", *pp, pp);pp++;  // 移動到下一個指針元素}
}// 8. 二級指針作為函數參數(修改指針本身)
void allocateMemory(int **ptr, int size) {// 為指針分配內存,需要二級指針才能修改外部指針*ptr = (int*)malloc(size * sizeof(int));if(*ptr == NULL) {printf("\n內存分配失敗!\n");return;}// 初始化分配的內存for(int i = 0; i < size; i++) {*(*ptr + i) = i * 10;}
}int main() {basicPointerExample();int x = 100, y = 200;printf("\n交換前: x = %d, y = %d\n", x, y);swap(&x, &y);printf("交換后: x = %d, y = %d\n", x, y);pointerAndArray();pointerAndString();pointerArray();// 演示二級指針doublePointerExample();doublePointerAndPointerArray();// 二級指針作為函數參數示例int *arr = NULL;allocateMemory(&arr, 5);  // 傳遞指針的地址if(arr != NULL) {printf("\n通過二級指針分配的數組: ");for(int i = 0; i < 5; i++) {printf("%d ", arr[i]);}printf("\n");free(arr);  // 釋放內存}return 0;
}

二級指針重點解析

  1. 二級指針的定義與初始化

    int num = 100;
    int *p = &num;    // 一級指針
    int **pp = &p;    // 二級指針,指向指針p
    

    這里pp就是二級指針,它存儲的是一級指針p的地址。

  2. 二級指針的解引用

    • *pp:得到一級指針p的值(即num的地址)
    • **pp:通過兩次解引用,得到最終變量num的值
  3. 二級指針的主要用途

    • 訪問指針數組:如示例中遍歷存儲字符串的指針數組
    • 作為函數參數修改指針本身:當需要在函數內部為指針分配內存或修改指針指向時
    • 處理動態二維數組:二級指針常用來表示動態分配的二維數組
  4. 使用注意事項

    • 二級指針也可能出現空指針問題,使用前需檢查
    • 多級指針會增加代碼復雜度,應避免過度使用
    • 動態分配內存后需記得釋放,防止內存泄漏

通過二級指針,我們可以更靈活地操作指針本身,這在處理復雜數據結構和動態內存分配時特別有用。

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

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

相關文章

界面布局智能建議生成:從功能需求到專業UI的AI加速之路

內容簡介: 傳統界面設計讓產品經理陷入"不懂設計、等設計師"的困境&#xff0c;效率低下還容易被挑刺。本文深度解析DeepSeek驅動的界面布局智能生成技術&#xff0c;通過DESIGN框架提示詞模板&#xff0c;讓產品經理在30分鐘內生成3種專業級界面方案&#xff0c;實現…

【BLE系列-第三篇】數據鏈路層(LL):廣播/連接/掃描流程詳解

目錄 引言 一、廣播及連接建立 1.1 廣播類型 1.2 掃描/連接請求與響應 1.2.1 廣播流程說明 1.2.1.1 廣播流程示例圖 1.2.1.2 廣播信息設置 1.2.1.3 信道廣播 1.2.1.4 信道切換 1.2.1.5 廣播間隔 1.2.1.6 接收窗口與理論最小傳輸時間 1.2.2 掃描/連接流程說明 1.2.…

JMeter 測試 WebSocket 接口的詳細教程

1. 安裝 WebSocket 插件 方法一&#xff1a;通過 Plugins Manager 下載并安裝 JMeter Plugins Manager在 JMeter 中&#xff1a;Options → Plugins Manager搜索 WebSocket 并安裝 方法二&#xff1a;手動安裝 下載 jmeter-websocket-samplers 插件將 jar 文件放到 JMeter/…

飛算JavaAI智慧教育場景實踐:從個性化學習到教學管理的全鏈路技術革新

目錄一、智慧教育核心場景的技術突破1.1 個性化學習路徑推薦系統1.1.1 學習者能力建模與評估1.2 智能教學管理系統1.2.1 自動化作業批改與學情分析1.3 教育資源智能管理系統1.3.1 教育資源智能標簽與推薦二、智慧教育系統效能升級實踐2.1 教育數據中臺構建2.1.1 教育數據整合與…

Java面試場景題大全精簡版

1.分布式系統下如何實現服務限流核心算法&#xff1a;固定窗口&#xff1a;將時間劃分為固定窗口&#xff08;如 1 秒&#xff09;&#xff0c;統計窗口內請求數&#xff0c;超過閾值則限流。實現簡單但存在臨界值突發流量問題。滑動窗口&#xff1a;將固定窗口拆分為多個小窗口…

紅帽 AI 推理服務 (vLLM) - 入門篇

《教程匯總》 RedHat AI Inference Server 和 vLLM vLLM (Virtual Large Language Model) 是一款專為大語言模型推理加速而設計的框架。它是由加州大學伯克利分校 (UC Berkeley) 的研究團隊于 2023 年開源的項目&#xff0c;目前 UC Berkeley 和 RedHat 分別是 vLLM 開源社區…

Sql server 命令行和控制臺使用二三事

近來遇到了幾件關于sql server的事情。 第一&#xff1a;低版本sqlserver備份竟然無法還原到高版本 奇怪&#xff01;從來未碰到過。過程如下&#xff1a; 1.在低版本上中備份好了數據庫 2.通過共享將文件拷貝到新服務器上 3.打開控制臺&#xff0c;還原數據庫&#xff0c;結果…

vue excel轉json功能 xlsx

需求&#xff1a; 完成excel表格內容轉json&#xff0c;excel表格內可能存在多個表格&#xff0c;要求全部解析出來。完成表格內合服功能&#xff0c;即&#xff1a;提取表格內老服務器與新服務器數據&#xff0c;多臺老服務器對應合并到一臺新服務器上 3.最終輸出結果為:[{‘1…

Qwen-OCR:開源OCR技術的演進與全面分析

目錄 一、Qwen-OCR的歷史與發展 1.1 起源與早期發展(2018-2020) 1.2 技術突破期(2020-2022) 1.3 開源與生態建設(2022至今) 二、技術競品分析 2.1 國際主流OCR解決方案對比 2.2 國內競品分析 三、部署需求與技術規格 3.1 硬件需求 3.2 軟件依賴 3.3 云部署方案 四、…

可視化+自動化:招聘管理看板軟件的核心技術架構解析

引言&#xff1a;現代招聘的挑戰與轉型隨著全球化和科技的迅速發展&#xff0c;企業的人力資源管理面臨著前所未有的挑戰。尤其是在招聘環節&#xff0c;隨著人才市場的競爭日益激烈&#xff0c;企業必須在確保招聘質量的同時&#xff0c;提升招聘效率。這不僅要求招聘人員具備…

【數據結構】——棧(Stack)的原理與實現

目錄一. 棧的認識1. 棧的基本概念2.棧的基本操作二. 棧的核心優勢1. 高效的時間復雜度2. 簡潔的邏輯設計3. 內存管理優化三. 棧的代碼實現1.棧的結構定義2. 棧的初始化3. 入棧 &#xff08;動態擴容&#xff09;4. 出棧5. 取棧頂數據6. 判斷棧是否為空7. 獲取棧的數據個數8.銷毀…

使用TexLive與VScode排版論文

前言 中文稿目前已經完成了&#xff0c;現在要轉用latex排版&#xff0c;但我對這方面沒有接觸過&#xff0c;這里做一個記錄。 網頁版Overleaf&#xff1a;Overleaf, 在線LaTeX編輯器。 TeXWorks&#xff1a;論文神器teXWorks安裝與使用記錄。 這里我還是決定采用Vscode作…

每日一題:2的冪數組中查詢范圍內的乘積;快速冪算法

題目選自2438. 二的冪數組中查詢范圍內的乘積 還是一樣的&#xff0c;先講解思路&#xff0c;然后再說代碼。 題目有一定難度&#xff0c;所以我要爭取使所有人都能看懂&#xff0c;用的方法會用最常規的思想。關于語言&#xff0c;都是互通的&#xff0c;只要你懂了一門語言…

Ceph數據副本機制詳解

Ceph 數據副本機制詳解 Ceph 的數據副本機制是其保證數據可靠性和高可用性的核心設計&#xff0c;主要通過多副本&#xff08;Replication&#xff09; 和 糾刪碼&#xff08;Erasure Coding&#xff0c;EC&#xff09; 兩種方式實現。以下是對 Ceph 數據副本機制的全面解析&am…

【八股】Mysql中小廠八股

MySQL 基礎 數據庫三大范式&#xff08;中&#xff09; 第一范式: 要求數據庫表的每一列都是不可分割的原子數據項 如詳細地址可以分割為省市區等. 第二范式: 非主鍵屬性必須完全依賴于主鍵, 不能部分依賴 第二范式要確保數據庫表中的每一列都和主鍵相關, 而不能只與主鍵的某一…

怎么使用python查看網頁源代碼

使用python查看網頁源代碼的方法&#xff1a;1、使用“import”命令導入requests包import requests2、使用該包的get()方法&#xff0c;將要查看的網頁鏈接傳遞進去&#xff0c;結果賦給變量xx requests.get(urlhttp://www.hao123.com)3、用“print (x.text)”語句把網頁的內容…

C# 多線程:并發編程的原理與實踐

深入探討 C# 多線程&#xff1a;并發編程的原理與實踐引言在現代應用開發中&#xff0c;性能和響應速度往往決定了用戶體驗的優劣。尤其在計算密集型或者IO密集型任務中&#xff0c;傳統的單線程模型可能無法有效利用多核CPU的優勢。因此&#xff0c;多線程技術成為了解決這些問…

react 常用組件庫

1. Ant Design&#xff08;螞蟻設計&#xff09;特點&#xff1a;國內最流行的企業級 UI 組件庫之一&#xff0c;基于「中后臺設計體系」&#xff0c;組件豐富&#xff08;表單、表格、彈窗、導航等&#xff09;、設計規范統一&#xff0c;支持主題定制和國際化。適用場景&…

Python 爬蟲獲取淘寶商品信息、價格及主圖的實戰指南

在電商數據分析、競品調研或商品信息采集等場景中&#xff0c;獲取淘寶商品的詳細信息&#xff08;如價格、主圖等&#xff09;是常見的需求。雖然淘寶開放平臺提供了官方的 API 接口&#xff0c;但使用這些接口需要一定的開發和配置工作。本文將通過 Python 爬蟲的方式&#x…

Ruby面向對象編程中類與方法的基礎學習例子解析

代碼示例&#xff1a; Ruby面向對象編程中類與方法的基礎學習詳細例子 1. 引言 在面向對象編程&#xff08;OOP&#xff09;中&#xff0c;類是定義對象結構和行為的藍圖。Ruby是一種純面向對象的編程語言&#xff0c;它將一切視為對象&#xff0c;包括基本數據類型。本文將…