C語言易混淆知識點詳解

C語言中容易混淆的知識點詳解

C語言作為一門基礎且強大的編程語言,有許多容易混淆的概念和特性。以下是C語言中一些常見易混淆知識點的詳細解析:

1. 指針與數組

相似點:

c

復制

下載

int arr[10];
int *ptr = arr;
  • 都可以使用[]運算符訪問元素:arr[3]ptr[3]都合法

  • 數組名在大多數情況下會退化為指向首元素的指針

區別:

特性數組指針
內存分配靜態分配固定大小空間動態分配或指向已有空間
sizeof返回數組總大小返回指針本身大小
賦值操作不能直接賦值可以重新指向
作為參數傳遞退化為指針保持指針特性

關鍵點sizeof(arr)返回整個數組的字節大小,而sizeof(ptr)返回指針的大小(通常4或8字節)。

2. 指針常量和常量指針

const的不同位置含義不同:

c

復制

下載

int a = 10, b = 20;const int *p1 = &a;  // 指向常量的指針(指針可以改變,指向的值不能改變)
int *const p2 = &a;  // 常量指針(指針不能改變,指向的值可以改變)
const int *const p3 = &a;  // 指向常量的常量指針(都不能改變)

記憶技巧:從右向左讀:

  • const int *?→ "指針指向一個const int"

  • int *const?→ "const指針指向int"

3. 結構體與聯合體

結構體(struct):

c

復制

下載

struct Point {int x;int y;
}; // 占用sizeof(int)*2字節
  • 各成員有獨立的內存空間

  • 總大小≥各成員大小之和(可能有內存對齊)

聯合體(union):

c

復制

下載

union Data {int i;float f;char str[20];
}; // 占用最大成員的大小(此處為20字節)
  • 所有成員共享同一內存空間

  • 同一時間只能存儲一個成員的值

4. 前置++與后置++

c

復制

下載

int i = 5;
int a = i++;  // a=5, i=6(后置:先使用值,再遞增)
int b = ++i;  // b=7, i=7(前置:先遞增,再使用值)

注意:在復雜表達式中使用可能引發未定義行為,如:

c

復制

下載

int i = 0;
int j = i++ + i++; // 未定義行為

5. 位運算與邏輯運算

位運算(按位操作):

c

復制

下載

&  // 按位與
|  // 按位或
^  // 按位異或
~  // 按位取反
<< // 左移
>> // 右移

邏輯運算(布爾操作):

c

復制

下載

&& // 邏輯與(短路求值)
|| // 邏輯或(短路求值)
!  // 邏輯非

關鍵區別

  • 位運算操作的是整數的二進制位

  • 邏輯運算操作的是表達式的真值(0為假,非0為真)

6. 數組指針與指針數組

c

復制

下載

int *p1[10];   // 指針數組:包含10個int指針的數組
int (*p2)[10]; // 數組指針:指向包含10個int的數組的指針

解析

  • p1是一個數組,其元素是指向int的指針

  • p2是一個指針,指向一個包含10個int的數組

7. 函數指針與指針函數

c

復制

下載

int *func(int);    // 指針函數:返回int指針的函數
int (*fp)(int);    // 函數指針:指向接受int參數并返回int的函數的指針

使用示例

c

復制

下載

int add(int a) { return a + 1; }
int (*fp)(int) = add;  // fp指向add函數
int result = fp(5);    // 通過函數指針調用

8. 內存分配方式

分配方式特點生命周期示例
靜態存儲編譯時確定大小整個程序運行期間全局變量、static變量
棧存儲自動分配釋放函數執行期間局部變量
堆存儲手動分配釋放直到顯式釋放malloc/free分配

常見錯誤

c

復制

下載

char *getString() {char str[] = "hello"; // 棧內存,函數返回后無效return str;           // 錯誤!返回懸垂指針
}

9. 字符串與字符數組

c

復制

下載

char str1[] = "hello";    // 字符數組,可修改內容
char *str2 = "hello";     // 指向字符串常量的指針,內容不可修改str1[0] = 'H';  // 合法
str2[0] = 'H';  // 未定義行為(可能引發段錯誤)

關鍵點:字符串字面量存儲在只讀內存區域。

10. 預處理器與編譯器

預處理器指令(編譯前處理):

c

復制

下載

#define PI 3.14159    // 宏定義
#include <stdio.h>    // 文件包含
#ifdef DEBUG          // 條件編譯
#endif

編譯器處理:

  • 變量聲明/定義

  • 函數定義

  • 類型檢查等

常見混淆

c

復制

下載

#define SQUARE(x) x * x
int a = SQUARE(2+3); // 展開為2+3*2+3=11,而非預期的25

應定義為:

c

復制

下載

#define SQUARE(x) ((x)*(x))

11. 零值表示

類型零值表示
整型0
浮點型0.0
指針NULL或(void*)0
布爾型false
字符'\0'(空字符)

注意:NULL在C中通常是(void*)0,但在C++中是0nullptr

12. 類型轉換

隱式類型轉換(自動發生):

c

復制

下載

int i = 3.14;  // 3(截斷小數部分)
double d = i;  // 3.0

顯式類型轉換(強制轉換):

c

復制

下載

double d = 3.14;
int i = (int)d;  // C風格
int j = int(d);  // C++風格(在C中無效)

注意:強制轉換可能丟失信息或導致未定義行為。

13. 可變參數函數

c

復制

下載

#include <stdarg.h>void printArgs(int count, ...) {va_list args;va_start(args, count);for(int i = 0; i < count; i++) {int val = va_arg(args, int);printf("%d ", val);}va_end(args);
}

注意事項

  • 必須至少有一個固定參數

  • 無法直接知道可變參數的數量和類型

  • 類型不安全,容易出錯

14. 復雜聲明解析

使用"右左法則"解析復雜聲明:

  1. 從標識符開始

  2. 向右看,直到遇到)或聲明結束

  3. 向左看,直到遇到(或聲明開始

  4. 跳出括號,重復步驟2和3

示例

c

復制

下載

int (*(*func)(int))[10];

解析:

  1. func是一個指針

  2. 指向接受int參數并返回指針的函數

  3. 該指針指向包含10個int的數組

  4. 最終返回int

即:func是一個函數指針,該函數接受int參數并返回指向int數組的指針。

15. 未定義行為(UB)

C語言中有許多未定義行為,編譯器不保證其行為:

c

復制

下載

int i = 0;
printf("%d %d\n", i++, i++); // 未定義int arr[5] = {1,2,3,4,5};
int *p = arr;
printf("%d\n", *p++ + *p++); // 未定義int a = 10;
a = a++; // 未定義

原則:避免在同一個表達式中對同一變量多次修改。

掌握這些易混淆知識點有助于編寫更可靠、更高效的C代碼,并避免常見的陷阱和錯誤。

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

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

相關文章

MCP原理詳解及實戰案例(動嘴出UI稿、3D建模)

文章目錄 MCP 原理介紹架構核心組件協議層傳輸層連接生命周期MCP與function calling: 互補關系 MCP python SDKMCP的優點 怎么用MCP&#xff1a;天氣服務參考應用項目&#xff1a; REF 24年11月份&#xff0c;claude推出了模型上下文協議( MCP),作為一種潛在的解決方案&#xf…

2025年深圳杯數學建模(東三省)B題【顏色轉換】原論文講解(含完整python代碼)

大家好呀&#xff0c;從發布賽題一直到現在&#xff0c;總算完成了2025年深圳杯數學建模&#xff08;東三省&#xff09;B題【顏色轉換】完整的成品論文。 本論文可以保證原創&#xff0c;保證高質量。絕不是隨便引用一大堆模型和代碼復制粘貼進來完全沒有應用糊弄人的垃圾半成…

cpp學習筆記1--class

2年前學過cpp&#xff0c;但是一直沒有用到&#xff0c;現在要讀研了&#xff0c;終于要用到了&#xff0c;重新拿出來看一看&#xff0c;覺得很多東西都能在c和python上看到影子。 #include "iostream" class Person { private:std::string name;int age;public://…

基于YOLOv的目標檢測訓練數據構建方法研究—圖像采集、標注、劃分與增強一體化流程設計

在目標檢測任務中,高質量的訓練數據是模型性能提升的關鍵。本文圍繞 YOLOv 系列模型,系統性地研究了目標檢測訓練數據的構建方法,提出了一套從圖像采集、標注、數據集劃分到數據增強的一體化流程設計 。通過多源圖像采集策略確保樣本多樣性,結合 LabelImg 工具完成 VOC 格式…

SQL數據庫操作大全:從基礎到高級查詢技巧

大家好&#xff0c;歡迎來到程序視點&#xff01;我是你們的老朋友.小二&#xff01; SQL數據庫操作核心語法精要 數據庫基礎操作 創建/刪除數據庫&#xff1a;CREATE DATABASE / DROP DATABASE 備份SQL Server&#xff1a;使用sp_addumpdevice和BACKUP DATABASE命令 數據庫…

[2025]MySQL的事務機制是什么樣的?redolog,undolog、binog三種日志的區別?二階段提交是什么?ACID怎么保證的?主從復制的過程?

MySQL事務機制與日志系統詳解 一、MySQL事務機制 1. 事務特性&#xff08;ACID&#xff09; 特性實現機制原子性(Atomicity)undo log回滾,(事務作為一個整體被執行&#xff0c;包含在其中的對數據庫的操作要么全部被執行&#xff0c;要么都不執行)。一致性(Consistency)約束…

LLama-v2 權重下載

地址&#xff1a;llama模型 官方github倉庫&#xff1a;llama倉庫 注意點 網絡代理位置&#xff1a;美國下面的國家選擇 United States 克隆倉庫后 運行bash download.sh輸入郵箱收到的URL選擇要下載的權重等待下載完成即可 有問題留言&#xff01;&#xff01;&#xff01…

zephyr OS架構下構建Nordic MCU boot

目錄 概述 1. 軟硬件環境 1.1 軟件開發環境 1.2 硬件環境 2 MCU boot 2.1 核心功能 2.2 關鍵術語 2.3 重要字段介紹 3 VS-Code下創建MCU-BOOT項目 3.1 軟件框架結構 3.2 創建測試項目 3.3 編譯項目 3.3 固件在Flash中的分布 4 驗證 4.1 燒寫固件 ? 4.2 代碼…

【Mytais系列】介紹、核心概念

MyBatis 是一款優秀的 持久層框架&#xff0c;它通過簡化 JDBC 操作、提供靈活的 SQL 映射能力&#xff0c;成為 Java 開發中處理數據庫交互的核心工具之一。以下是 MyBatis 的核心框架和概念解析&#xff1a; 一、MyBatis 框架概述 1. 核心定位 作用&#xff1a;將 Java 對象…

IO模型和多路復用

一、IO模型的基礎理解 什么是IO? IO全稱是 Input/Output(輸入/輸出),在計算機科學里主要指程序與外部設備(硬盤、網絡、用戶終端等)進行數據交換的操作。首要特點是: IO通常很慢(從CPU和內存的視角看)經常需要等待外部設備響應1. 為什么要談IO模型? 當一個程序需要…

深入理解 Bash 中的 $‘...‘ 字符串語法糖

在 Bash 腳本編程中&#xff0c;字符串處理是不可或缺的一部分。為了讓開發者更高效地處理特殊字符和控制字符&#xff0c;Bash 引入了一種獨特的字符串語法糖&#xff1a;$&#xff08;帶單引號的 ANSI-C 風格字符串&#xff09;。這種語法來源于 C 語言的 ANSI-C 標準&#x…

用Python打造自己的專屬命令行工具

在日常的開發和使用過程中&#xff0c;我們常常會編寫一些實用的Python腳本&#xff0c;比如用來批量處理文件、獲取系統信息等。然而&#xff0c;每次都要輸入python script_name.py來運行腳本&#xff0c;時間一長難免覺得繁瑣。要是能像使用系統自帶的命令&#xff08;如ls、…

【KWDB 創作者計劃】KWDB 2.2.0多模融合架構與分布式時序引擎

KWDB介紹 KWDB數據庫是由開放原子開源基金會孵化的分布式多模數據庫&#xff0c;專為AIoT場景設計&#xff0c;支持時序數據、關系數據和非結構化數據的統一管理。其核心架構采用多模融合引擎&#xff0c;集成列式時序存儲、行式關系存儲及自適應查詢優化器&#xff0c;實現跨模…

學習Linux的第二天

如何在Linux環境下做開發 Linux的一些基操 Tips&#xff1a;平常最表層的是命令行模式&#xff0c;最多見這個默認叫做命令行模式 Vi操作是什么意思呢 就是在提示符輸入vi a.c 是可以創建一個a.c這個文件并進入這個輸入模式 按i可以輸入代碼 要退出的時候按esc 再按:(冒號…

鏈表操作練習

要求 現在有一個雙向鏈表&#xff0c;里面要保存歌曲的名字&#xff1b;例如 蔡琴/渡口.mp3 我們把它定義在一個link.h文件中。 #ifndef LINK_H #define LINK_H #include <stdlib.h> #include <stdio.h> #include <string.h>typedef struct Node {//保存歌…

MATLAB制作散點圖:從基礎到進階的三種類型講解

一、什么是散點圖 散點圖是一種用來展示兩個或多個變量之間關系的圖表形式。它可以幫助我們直觀地觀察變量之間是否存在相關性、趨勢或異常值&#xff0c;常用于數據分析的初步探索階段。 二、三種類型散點圖 1. 基本二維散點圖&#xff1a;最簡單、最常用 基本二維散點圖的…

模塊方法模式(Module Method Pattern)

&#x1f9e0; 模塊方法模式&#xff08;Module Method Pattern&#xff09; 模塊方法模式是一種結構型設計模式&#xff0c;它將復雜的操作分解成一系列相對簡單、獨立且單一職責的模塊。每個模塊負責完成一種具體的操作&#xff0c;其他模塊或系統可以通過調用這些模塊的公開…

Python中的JSON庫,詳細介紹與代碼示例

目錄 1. 前言 2. json 庫基本概念 3. json 的適應場景 4. json 庫的基本用法 4.1 導 json入 模塊 4.2 將 Python 對象轉換為 JSON 字符串 4.3 將 JSON 字符串轉換為 Python 對象 4.4 將 Python 對象寫入 JSON 文件 4.5 從 JSON 文件讀取數據 4.6 json 的其他方法 5.…

網狐旗艦大聯盟組件源碼私測筆記:結構分層、UI重構與本地實操全流程

作為一套衍生于傳統網狐架構的源碼版本&#xff0c;大聯盟這套源碼組件可謂是在經典基礎上進行了深度重塑。與老版死板的框架風格不同&#xff0c;它不僅對界面做了大刀闊斧的重構&#xff0c;還在組件層級的組織上做了優化。本文將基于一整套源碼進行深度解析&#xff0c;強調…

STM32 PulseSensor心跳傳感器驅動代碼

STM32CubeMX中準備工作&#xff1a; 1、設置AD 通道 2、設置一個定時器中斷&#xff0c;間隔時間2ms&#xff0c;我這里采用的是定時器7 3、代碼優化01 PulseSensor.c文件 #include "main.h" #include "PulseSensor/PulseSensor.h"/******************…