AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

深入 C++ 和 C 的指針世界

來源: 責編: 時間:2024-05-16 09:03:34 121觀看
導讀在C和C++編程中,指針是一個至關重要的概念。從初學者到高級開發(fā)者,掌握指針的使用不僅能提高代碼效率,還能增強對內存管理的理解。一、初級:指針基礎1.什么是指針?指針是一個變量,其值為另一個變量的地址。簡單來說,指針存儲

在C和C++編程中,指針是一個至關重要的概念。從初學者到高級開發(fā)者,掌握指針的使用不僅能提高代碼效率,還能增強對內存管理的理解。MwC28資訊網(wǎng)——每日最新資訊28at.com

MwC28資訊網(wǎng)——每日最新資訊28at.com

一、初級:指針基礎

1.什么是指針?

指針是一個變量,其值為另一個變量的地址。簡單來說,指針存儲的是內存地址而不是數(shù)據(jù)本身。MwC28資訊網(wǎng)——每日最新資訊28at.com

#include <stdio.h>int main() {  int a = 10;  int* p = &a; // p 是一個指向 a 的指針    printf("a 的值: %d/n", a); // 輸出 10  printf("p 指向的地址: %p/n", p); // 輸出 a 的地址  printf("*p 的值: %d/n", *p); // 輸出 10 (解引用指針 p 獲取值)    return 0;}

在上面的例子中,int* p 聲明了一個指向整型變量的指針 p,并將 a 的地址賦給了它。*p 用于解引用指針,從而獲得 a 的值。MwC28資訊網(wǎng)——每日最新資訊28at.com

2.指針的基本操作

  • 聲明指針:int* p;
  • 獲取變量地址:p = &a;
  • 解引用指針:*p

3.指針和數(shù)組

指針和數(shù)組密切相關。在很多情況下,指針可以用來遍歷數(shù)組。MwC28資訊網(wǎng)——每日最新資訊28at.com

#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int* p = arr; // p 指向數(shù)組的第一個元素for (int i = 0; i < 5; i++) {printf("%d ", *(p + i)); // 使用指針遍歷數(shù)組}return 0;}

4.指針數(shù)組 

數(shù)組中的元素是指針類型,可以用來存儲一組指針。MwC28資訊網(wǎng)——每日最新資訊28at.com

int x = 10, y = 20, z = 30;int *ptrArr[3] = {&x, &y, &z};printf("Second element: %d/n", *ptrArr[1]); // 訪問指針數(shù)組的第二個指針所指向的值

5.數(shù)組指針(pointer to an array) 

是一種指向數(shù)組的指針,它與指向數(shù)組第一個元素的普通指針不同。數(shù)組指針的主要用途是在處理多維數(shù)組時更加方便。這里詳細介紹數(shù)組指針的定義和使用方法。MwC28資訊網(wǎng)——每日最新資訊28at.com

數(shù)組指針是指向數(shù)組的指針,其定義方式如下:MwC28資訊網(wǎng)——每日最新資訊28at.com

int (*ptr)[N]; 其中,N是數(shù)組的大小。ptr是一個指向包含N個整型元素的數(shù)組的指針。MwC28資訊網(wǎng)——每日最新資訊28at.com

數(shù)組指針的使用 以下是一些使用數(shù)組指針的示例:MwC28資訊網(wǎng)——每日最新資訊28at.com

(1) 一維數(shù)組指針MwC28資訊網(wǎng)——每日最新資訊28at.com

#include <stdio.h>int main() {    int arr[5] = {1, 2, 3, 4, 5};    int (*ptr)[5] = &arr; // ptr是指向包含5個整型元素的數(shù)組的指針    printf("First element: %d/n", (*ptr)[0]);    printf("Second element: %d/n", (*ptr)[1]);    return 0;}

在這個例子中,ptr指向數(shù)組arr,通過(*ptr)[i]訪問數(shù)組中的元素。MwC28資訊網(wǎng)——每日最新資訊28at.com

(2) 二維數(shù)組指針 MwC28資訊網(wǎng)——每日最新資訊28at.com

對于二維數(shù)組,數(shù)組指針的使用更為常見和有用:MwC28資訊網(wǎng)——每日最新資訊28at.com

#include <stdio.h>int main() {    int arr[3][4] = {        {1, 2, 3, 4},        {5, 6, 7, 8},        {9, 10, 11, 12}    };    int (*ptr)[4] = arr; // ptr是指向包含4個整型元素的數(shù)組的指針    for (int i = 0; i < 3; ++i) {        for (int j = 0; j < 4; ++j) {            printf("%d ", ptr[i][j]);        }        printf("/n");    }    return 0;}

在這個例子中,ptr是一個指向包含4個整型元素的數(shù)組的指針,也就是指向二維數(shù)組的每一行。通過ptr[i][j]訪問二維數(shù)組中的元素。MwC28資訊網(wǎng)——每日最新資訊28at.com

二、中級:指針進階

1.指針的指針

指針不僅可以指向數(shù)據(jù),還可以指向另一個指針,這種情況稱為指針的指針。MwC28資訊網(wǎng)——每日最新資訊28at.com

#include <stdio.h>int main(){  int a = 10;  int* p = &a;  int** pp = &p; // pp 是一個指向指針 p 的指針    printf("a 的值: %d/n", a); // 輸出 10  printf("*p 的值: %d/n", *p); // 輸出 10  printf("**pp 的值: %d/n", **pp); // 輸出 10    return 0;}

2.函數(shù)指針

函數(shù)指針是指向函數(shù)的指針,可以用來動態(tài)調用函數(shù)。MwC28資訊網(wǎng)——每日最新資訊28at.com

#include <stdio.h>int add(int a, int b) {return a + b;}int main() {int (*func_ptr)(int, int) = &add; // 聲明一個指向函數(shù)的指針int result = func_ptr(3, 4); // 調用函數(shù)printf("結果: %d/n", result); // 輸出 7return 0;}

3.指針函數(shù) 

是一個返回指針的函數(shù)。它與函數(shù)指針不同,函數(shù)指針是指向函數(shù)的指針,而指針函數(shù)是返回值為指針類型的函數(shù)。下面詳細介紹指針函數(shù)的定義、使用方法及一些常見的例子。MwC28資訊網(wǎng)——每日最新資訊28at.com

定義指針函數(shù),指針函數(shù)的定義方式是指定函數(shù)返回值為指針類型,例如:MwC28資訊網(wǎng)——每日最新資訊28at.com

int* func();

這表示func是一個返回int類型指針的函數(shù)。MwC28資訊網(wǎng)——每日最新資訊28at.com

指針函數(shù)的使用 指針函數(shù)通常用于動態(tài)分配內存、返回數(shù)組、字符串或結構體等情況。以下是一些使用指針函數(shù)的例子:MwC28資訊網(wǎng)——每日最新資訊28at.com

(1) 返回指向單個變量的指針MwC28資訊網(wǎng)——每日最新資訊28at.com

#include <stdio.h>int* getNumber() {    static int num = 42; // 使用static使num的生命周期延續(xù)到函數(shù)之外    return #}int main() {    int *ptr = getNumber();    printf("Number: %d/n", *ptr);    return 0;}

在這個例子中,getNumber函數(shù)返回指向num的指針。因為num是靜態(tài)變量,它在函數(shù)返回后依然存在。MwC28資訊網(wǎng)——每日最新資訊28at.com

(2) 返回動態(tài)分配內存的指針MwC28資訊網(wǎng)——每日最新資訊28at.com

#include <stdio.h>#include <stdlib.h>int* allocateArray(int size) {    int *arr = (int *)malloc(size * sizeof(int));    return arr;}int main() {    int *arr = allocateArray(5);    if (arr != NULL) {        for (int i = 0; i < 5; i++) {            arr[i] = i * 2;        }        for (int i = 0; i < 5; i++) {            printf("%d ", arr[i]);        }        printf("/n");        free(arr); // 別忘了釋放內存    }    return 0;}

這個例子中,allocateArray函數(shù)返回一個指向動態(tài)分配內存的指針。MwC28資訊網(wǎng)——每日最新資訊28at.com

(3) 返回指向數(shù)組的指針MwC28資訊網(wǎng)——每日最新資訊28at.com

復制代碼#include <stdio.h>int* getArray() {    static int arr[5] = {1, 2, 3, 4, 5};    return arr;}int main() {    int *ptr = getArray();    for (int i = 0; i < 5; i++) {        printf("%d ", ptr[i]);    }    printf("/n");    return 0;}

在這個例子中,getArray函數(shù)返回指向靜態(tài)數(shù)組arr的指針。靜態(tài)數(shù)組在函數(shù)返回后依然存在,所以返回的指針是有效的。MwC28資訊網(wǎng)——每日最新資訊28at.com

(4) 常見的應用場景 MwC28資訊網(wǎng)——每日最新資訊28at.com

  • 字符串操作:函數(shù)返回指向字符串的指針,例如處理輸入輸出字符串。
  • 鏈表操作:函數(shù)返回指向鏈表節(jié)點的指針,用于創(chuàng)建、插入、刪除鏈表節(jié)點。
  • 動態(tài)內存管理:函數(shù)返回動態(tài)分配的內存指針,用于數(shù)組、結構體等的動態(tài)創(chuàng)建和管理。

4.動態(tài)內存分配

動態(tài)內存分配是指在運行時分配內存,而不是在編譯時。C語言提供了 malloc、calloc 和 free 函數(shù)來進行動態(tài)內存分配和釋放。MwC28資訊網(wǎng)——每日最新資訊28at.com

#include <stdio.h>#include <stdlib.h>int main() {int* p = (int*)malloc(sizeof(int) * 5); // 分配5個整數(shù)大小的內存if (p == NULL) {printf("內存分配失敗/n");return 1;}for (int i = 0; i < 5; i++) {p[i] = i + 1; // 使用分配的內存}for (int i = 0; i < 5; i++) {printf("%d ", p[i]);}free(p); // 釋放內存return 0;}

常量指針和指針常量是兩個非常重要的概念,在C和C++中經(jīng)常被用到。它們分別表示指針和指針指向的內容的常量性不同。MwC28資訊網(wǎng)——每日最新資訊28at.com

5.常量指針(const pointer)

指針本身是常量,不能修改指向的地址,但可以修改指針指向的內容。MwC28資訊網(wǎng)——每日最新資訊28at.com

int x = 10;int y = 20;const int *ptr = &x; // 常量指針,指向一個整型常量*ptr = 5; // 錯誤,不能通過常量指針修改指向的內容ptr = &y; // 正確,可以修改常量指針指向的地址

6.指針常量(pointer to const)

指針指向的內容是常量,不能通過指針修改其指向的內容,但可以修改指針指向的地址。MwC28資訊網(wǎng)——每日最新資訊28at.com

int x = 10;int y = 20;int *const ptr = &x; // 指針常量,指針本身是常量,指向一個整型變量*ptr = 5; // 正確,可以通過指針修改指向的內容ptr = &y; // 錯誤,不能修改指針常量指向的地址

總的來說,常量指針用于保護指向的內容不被修改,而指針常量用于保護指針本身不被修改。在實際編程中,根據(jù)需求選擇合適的類型可以增強代碼的安全性和可讀性。MwC28資訊網(wǎng)——每日最新資訊28at.com

7.常量指針常量(const pointer to const)

是指指針本身和指針指向的內容都是常量,即既不能通過指針修改指向的地址,也不能通過指針修改指向的內容。MwC28資訊網(wǎng)——每日最新資訊28at.com

int x = 10;const int y = 20;const int *const ptr = &x; // 常量指針常量,指針和指向的內容都是常量*ptr = 5; // 錯誤,不能通過指針修改指向的內容ptr = &y; // 錯誤,不能修改指針指向的地址

在上面的例子中,ptr是一個指向整型常量的常量指針常量,因此既不能通過ptr修改指向的內容,也不能修改ptr指向的地址。這種類型的指針通常用于指向常量數(shù)據(jù),以確保數(shù)據(jù)的不可變性。MwC28資訊網(wǎng)——每日最新資訊28at.com

三、高級:指針高級用法

1.指向函數(shù)的指針數(shù)組 

指針數(shù)組可以用來存儲多個函數(shù)指針,從而實現(xiàn)動態(tài)調用不同的函數(shù)。MwC28資訊網(wǎng)——每日最新資訊28at.com

#include <stdio.h>int add(int a, int b) {return a + b;}int subtract(int a, int b) {return a - b;}int multiply(int a, int b) {return a * b;}int main() {int (*func_ptr[])(int, int) = {add, subtract, multiply};int x = 10, y = 5;for (int i = 0; i < 3; i++) {printf("結果: %d/n", func_ptr[i](x, y));}return 0;}

2.指針與數(shù)據(jù)結構* 

在數(shù)據(jù)結構中,指針用于實現(xiàn)鏈表、樹等結構。以下是單鏈表的簡單實現(xiàn):MwC28資訊網(wǎng)——每日最新資訊28at.com

#include <stdio.h>#include <stdlib.h>struct Node {int data;struct Node* next;};void printList(struct Node* n) {while (n != NULL) {printf("%d ", n->data);n = n->next;}}int main() {struct Node* head = NULL;struct Node* second = NULL;struct Node* third = NULL;head = (struct Node*)malloc(sizeof(struct Node));second = (struct Node*)malloc(sizeof(struct Node));third = (struct Node*)malloc(sizeof(struct Node));head->data = 1;head->next = second;second->data = 2;second->next = third;third->data = 3;third->next = NULL;printList(head);free(head);free(second);free(third);return 0;}

3.多維數(shù)組與指針

多維數(shù)組可以使用指針進行遍歷和操作。MwC28資訊網(wǎng)——每日最新資訊28at.com

int main() {int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};int (*p)[3] = arr; // 指向包含3個整數(shù)的一維數(shù)組的指針for (int i = 0; i < 2; i++) {  for (int j = 0; j < 3; j++)   {    printf("%d ", p[i][j]);  }  printf("/n");}return 0;}

4.指針的陷阱與安全

指針的使用雖然強大,但也伴隨著潛在的風險,如懸空指針、野指針、緩沖區(qū)溢出等。 MwC28資訊網(wǎng)——每日最新資訊28at.com

  • 懸空指針:指針指向的內存已經(jīng)被釋放,但指針本身未被重置為NULL。 
  • 野指針:指針未初始化或指向未分配的內存區(qū)域。
#include <stdio.h>#include <stdlib.h>int main() {int* p = (int*)malloc(sizeof(int));*p = 10;free(p);p = NULL; // 避免懸空指針if (p != NULL) {*p = 20; // 避免野指針} else {printf("指針已被釋放/n");}return 0;}

5.C++中的智能指針 

C++11引入了智能指針,用于自動管理內存,避免內存泄漏。常見的智能指針包括 std::unique_ptr 和 std::shared_ptr。MwC28資訊網(wǎng)——每日最新資訊28at.com

#include <iostream>#include <memory>class Test {public:Test() { std::cout << "構造函數(shù)/n"; }~Test() { std::cout << "析構函數(shù)/n"; }};int main() {std::unique_ptr<Test> ptr1(new Test());std::shared_ptr<Test> ptr2 = std::make_shared<Test>();{std::shared_ptr<Test> ptr3 = ptr2;std::cout << "共享計數(shù): " << ptr2.use_count() << std::endl;}std::cout << "共享計數(shù): " << ptr2.use_count() << std::endl;return 0;}

6.指針的最佳實踐 

  • 初始化指針:聲明指針時盡量初始化。
  • 使用智能指針:在C++中盡量使用智能指針管理動態(tài)內存。 
  • 避免懸空指針和野指針:釋放內存后將指針置為NULL,使用指針前確保其指向有效內存。 
  • 定期檢查內存泄漏:使用工具如Valgrind進行內存檢查。

本文鏈接:http://www.tebozhan.com/showinfo-26-88323-0.html深入 C++ 和 C 的指針世界

聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 解鎖 Python 超能力:十大變革性庫與框架

下一篇: 八個將網(wǎng)頁轉為桌面應用程序的開源方案

標簽:
  • 熱門焦點
  • 天貓精靈Sound Pro體驗:智能音箱沒有音質?來聽聽我的

    這幾年除了手機作為智能生活終端最主要的核心之外,第二個可以成為中心點的產(chǎn)品是什么?——是智能音箱。 手機在執(zhí)行命令的時候有兩種操作方式,手和智能語音助手,而智能音箱只
  • 5月iOS設備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數(shù)據(jù),像安卓陣營的榜單都有著比較大的變動,不過iOS由于設備的更新?lián)Q代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發(fā)生
  • 雅柏威士忌多款單品價格大跌,泥煤頂流也不香了?

    來源 | 烈酒商業(yè)觀察編 | 肖海林今年以來,威士忌市場開始出現(xiàn)了降溫跡象,越來越多不斷暴漲的網(wǎng)紅威士忌也開始悄然回歸市場理性。近日,LVMH集團旗下蘇格蘭威士忌品牌雅柏(Ardbeg
  • Temu起訴SHEIN,跨境電商戰(zhàn)事升級

    來源 | 伯虎財經(jīng)(bohuFN)作者 | 陳平安日前據(jù)外媒報道,拼多多旗下跨境電商平臺Temu正對競爭對手SHEIN提起新訴訟,訴狀稱Shein&ldquo;利用市場支配力量強迫服裝廠商與之簽訂獨家
  • 共享單車的故事講到哪了?

    來源丨??素斀?jīng)與共享充電寶相差不多,共享單車已很久沒有被國內熱點新聞關照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發(fā)報道稱,成都、天津、鄭州等地多個共享單
  • 華為開發(fā)者大會2023日程公開:開設鴻蒙HarmonyOS 4體驗區(qū)

    IT之家 7 月 31 日消息,華為今日公布了 HDC.Together 開發(fā)者大會 2023 的詳細日程。整場大會將于 8 月 4 日-6 日之間舉行,屆時將發(fā)布最新一代鴻蒙 H
  • iQOO Neo8系列新品發(fā)布會

    旗艦雙芯 更強更Pro
  • “買真退假” 這種“羊毛”不能薅

    □ 法治日報 記者 王春   □ 本報通訊員 胡佳麗  2020年初,還在上大學的小東加入了一個大學生兼職QQ群。群主&ldquo;七王&rdquo;在群里介紹一些刷單賺
Top