日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

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

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

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

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

re128資訊網——每日最新資訊28at.com

一、初級:指針基礎

1.什么是指針?

指針是一個變量,其值為另一個變量的地址。簡單來說,指針存儲的是內存地址而不是數據本身。re128資訊網——每日最新資訊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 的值。re128資訊網——每日最新資訊28at.com

2.指針的基本操作

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

3.指針和數組

指針和數組密切相關。在很多情況下,指針可以用來遍歷數組。re128資訊網——每日最新資訊28at.com

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

4.指針數組 

數組中的元素是指針類型,可以用來存儲一組指針。re128資訊網——每日最新資訊28at.com

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

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

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

數組指針是指向數組的指針,其定義方式如下:re128資訊網——每日最新資訊28at.com

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

數組指針的使用 以下是一些使用數組指針的示例:re128資訊網——每日最新資訊28at.com

(1) 一維數組指針re128資訊網——每日最新資訊28at.com

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

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

(2) 二維數組指針 re128資訊網——每日最新資訊28at.com

對于二維數組,數組指針的使用更為常見和有用:re128資訊網——每日最新資訊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個整型元素的數組的指針    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個整型元素的數組的指針,也就是指向二維數組的每一行。通過ptr[i][j]訪問二維數組中的元素。re128資訊網——每日最新資訊28at.com

二、中級:指針進階

1.指針的指針

指針不僅可以指向數據,還可以指向另一個指針,這種情況稱為指針的指針。re128資訊網——每日最新資訊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.函數指針

函數指針是指向函數的指針,可以用來動態調用函數。re128資訊網——每日最新資訊28at.com

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

3.指針函數 

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

定義指針函數,指針函數的定義方式是指定函數返回值為指針類型,例如:re128資訊網——每日最新資訊28at.com

int* func();

這表示func是一個返回int類型指針的函數。re128資訊網——每日最新資訊28at.com

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

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

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

在這個例子中,getNumber函數返回指向num的指針。因為num是靜態變量,它在函數返回后依然存在。re128資訊網——每日最新資訊28at.com

(2) 返回動態分配內存的指針re128資訊網——每日最新資訊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函數返回一個指向動態分配內存的指針。re128資訊網——每日最新資訊28at.com

(3) 返回指向數組的指針re128資訊網——每日最新資訊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函數返回指向靜態數組arr的指針。靜態數組在函數返回后依然存在,所以返回的指針是有效的。re128資訊網——每日最新資訊28at.com

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

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

4.動態內存分配

動態內存分配是指在運行時分配內存,而不是在編譯時。C語言提供了 malloc、calloc 和 free 函數來進行動態內存分配和釋放。re128資訊網——每日最新資訊28at.com

#include <stdio.h>#include <stdlib.h>int main() {int* p = (int*)malloc(sizeof(int) * 5); // 分配5個整數大小的內存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++中經常被用到。它們分別表示指針和指針指向的內容的常量性不同。re128資訊網——每日最新資訊28at.com

5.常量指針(const pointer)

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

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

6.指針常量(pointer to const)

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

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

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

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

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

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

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

三、高級:指針高級用法

1.指向函數的指針數組 

指針數組可以用來存儲多個函數指針,從而實現動態調用不同的函數。re128資訊網——每日最新資訊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.指針與數據結構* 

在數據結構中,指針用于實現鏈表、樹等結構。以下是單鏈表的簡單實現:re128資訊網——每日最新資訊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.多維數組與指針

多維數組可以使用指針進行遍歷和操作。re128資訊網——每日最新資訊28at.com

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

4.指針的陷阱與安全

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

  • 懸空指針:指針指向的內存已經被釋放,但指針本身未被重置為NULL。 
  • 野指針:指針未初始化或指向未分配的內存區域。
#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。re128資訊網——每日最新資訊28at.com

#include <iostream>#include <memory>class Test {public:Test() { std::cout << "構造函數/n"; }~Test() { std::cout << "析構函數/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 << "共享計數: " << ptr2.use_count() << std::endl;}std::cout << "共享計數: " << ptr2.use_count() << std::endl;return 0;}

6.指針的最佳實踐 

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

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

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

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

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

標簽:
  • 熱門焦點
  • K60 Pro官方停產 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經透露了,Redmi K60 Pro已經停產且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產之后
  • 紅魔電競平板評測:大屏幕硬實力

    前言:三年的疫情因為要上網課的原因激活了平板市場,如今網課的時代已經過去,大家的生活都恢復到了正軌,這也就意味著,真正考驗平板電腦生存的環境來了。也就是面對著這種殘酷的
  • 太卷!Redmi MAX 100英寸電視便宜了:12999元買Redmi史上最大屏

    8月5日消息,從小米商城了解到,Redmi MAX 100英寸巨屏電視日前迎來官方優惠,到手價12999元,比發布價便宜了7000元,在大屏電視市場開卷。據了解,Redmi MAX 100
  • 把LangChain跑起來的三個方法

    使用LangChain開發LLM應用時,需要機器進行GLM部署,好多同學第一步就被勸退了,那么如何繞過這個步驟先學習LLM模型的應用,對Langchain進行快速上手?本片講解3個把LangChain跑起來
  • 多線程開發帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程
  • 慕巖炮轟抖音,百合網今何在?

    來源:價值研究所 作者:Hernanderz&ldquo;難道就因為自己的一個產品牛逼了,從客服到總裁,都不愿意正視自己產品和運營上的問題,選擇逃避了嗎?&rdquo;這一番話,出自百合網聯合創
  • 品牌洞察丨服務本地,美團直播成效幾何?

    來源:17PR7月11日,美團App首頁推薦位出現&ldquo;美團直播&rdquo;的固定入口。在直播聚合頁面,外賣&ldquo;神槍手&rdquo;直播間、美團旅行直播間、美團買菜直播間等均已上線,同時
  • 東方甄選單飛:有些鳥注定是關不住的

    作者:彭寬鴻來源:華爾街科技眼&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;東方甄選創始人俞敏洪帶隊的&ldquo;7天甘肅行&rdquo;直播活動已在近日順利收官。成立后一
  • 小米汽車電池信息疑似曝光:容量101kWh,支持800V高壓快充

    7月14日消息,今日一名博主在社交媒體發布了一張疑似小米汽車電池信息的照片,顯示該電池包正是寧德時代麒麟電池,容量為101kWh,電壓為726.7V,可以預測小
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲国产一区二区三区在线播| 国产精品视频精品视频| 狼狼综合久久久久综合网| 猛干欧美女孩| 欧美日韩国产91| 国产精品亚洲综合久久| 韩国三级在线一区| 亚洲三级观看| 午夜欧美大片免费观看| 蜜臀av在线播放一区二区三区| 欧美片在线观看| 国产拍揄自揄精品视频麻豆| 亚洲风情在线资源站| 欧美激情亚洲视频| 国产精品成人国产乱一区| 国产视频在线观看一区二区三区| 在线欧美福利| 亚洲女女做受ⅹxx高潮| 久久综合网色—综合色88| 欧美午夜在线观看| 一色屋精品视频在线看| 亚洲午夜激情免费视频| 蜜臀久久久99精品久久久久久| 欧美系列电影免费观看| 在线欧美一区| 先锋亚洲精品| 欧美久久久久久蜜桃| 国产一本一道久久香蕉| 99热精品在线| 久久琪琪电影院| 国产精品毛片a∨一区二区三区|国| 1000部国产精品成人观看| 亚洲视频网站在线观看| 免费成人av在线看| 国产日韩欧美在线播放| 一区二区三区久久网| 久久一区二区三区四区五区| 国产精品人人做人人爽| 亚洲精品综合精品自拍| 久久久精彩视频| 国产精品久久久久久久久久免费看 | 亚洲一区视频在线观看视频| 欧美成人免费观看| 亚洲一区二区三区在线看| 欧美影院在线| 欧美在线啊v| 欧美成人黑人xx视频免费观看| 欧美黑人国产人伦爽爽爽| 美女图片一区二区| 久久免费精品视频| 亚洲专区在线视频| 亚洲高清自拍| 亚洲成人在线免费| 国产亚洲成人一区| 尤物在线观看一区| 亚洲综合三区| 欧美精品一区二区三区高清aⅴ| 狠狠色狠色综合曰曰| 午夜精品影院| 日韩视频在线一区二区三区| 麻豆av福利av久久av| 国产亚洲亚洲| 欧美一区二区女人| 国产精品日韩欧美| 亚洲小说欧美另类婷婷| 欧美日韩视频在线一区二区观看视频| 国产亚洲亚洲| 欧美777四色影视在线| 欧美日韩综合在线免费观看| 亚洲国产小视频在线观看| 国产精品久久久久久超碰| 国产精品一区视频网站| 亚洲天堂成人| 欧美激情在线播放| 亚洲电影自拍| 久久亚洲不卡| 精品成人一区二区三区| 久久精品男女| 国内精品**久久毛片app| 久久动漫亚洲| 国产一区欧美日韩| 久久久久久久激情视频| 国产一区二区精品久久99| 欧美一区亚洲二区| 国产性色一区二区| 久久精品日韩| 一区二区视频欧美| 久久深夜福利免费观看| 在线看成人片| 蜜桃av久久久亚洲精品| 亚洲国产日韩综合一区| 欧美极品在线视频| 99视频一区二区| 欧美午夜女人视频在线| 亚洲一区二区三区免费在线观看| 亚洲精品美女91| 欧美成年人视频网站| 亚洲大片av| 欧美激情亚洲综合一区| 99v久久综合狠狠综合久久| 欧美日韩在线亚洲一区蜜芽| 亚洲欧美精品在线| 国产在线精品二区| 美女主播视频一区| 亚洲伦理在线| 国产精品免费网站在线观看| 欧美一级久久久| 精品二区久久| 欧美精品一线| 亚洲一区视频在线观看视频| 国产美女搞久久| 卡一卡二国产精品| 99精品国产在热久久| 国产精品素人视频| 久久久久久穴| 亚洲三级影院| 亚洲免费在线看| 国产精品免费一区二区三区观看 | 亚洲国产日韩综合一区| 欧美日本韩国一区| 午夜一区二区三区在线观看| 激情国产一区| 欧美日韩精品中文字幕| 欧美一区二区三区视频免费播放| 玉米视频成人免费看| 欧美区一区二| 欧美在线视频观看免费网站| 亚洲经典一区| 国产精品亚发布| 欧美a级一区| 亚洲欧美精品| 亚洲国产日韩在线| 国产精品永久免费观看| 免费在线观看日韩欧美| 欧美亚洲成人精品| 久久婷婷av| 中文久久乱码一区二区| 狠狠色综合日日| 欧美日韩在线一区| 久久免费偷拍视频| 亚洲在线观看| 亚洲全部视频| 国产一级揄自揄精品视频| 欧美日本在线看| 久久久久91| 亚洲午夜精品福利| 亚洲高清在线观看一区| 国产精品乱人伦中文| 农夫在线精品视频免费观看| 亚洲欧美日韩精品久久奇米色影视| 在线欧美一区| 国产午夜精品理论片a级探花| 欧美日韩国产欧美日美国产精品| 久久精品国产免费观看| 亚洲一区二区三区在线看 | 亚洲精品国产精品国自产在线 | 99国产精品久久久| 悠悠资源网亚洲青| 国产网站欧美日韩免费精品在线观看 | 国产亚洲精品资源在线26u| 欧美精品在线视频| 久久午夜av| 先锋影音一区二区三区| 一区二区日韩伦理片| 亚洲国产日韩欧美一区二区三区| 国产色婷婷国产综合在线理论片a| 欧美日韩亚洲国产一区| 欧美成人午夜免费视在线看片 | 国产精品劲爆视频| 欧美激情中文不卡| 免播放器亚洲一区| 久久久夜色精品亚洲| 欧美一区二区精品| 亚洲欧美成人综合| 亚洲深夜福利网站| 日韩亚洲欧美一区二区三区| 亚洲国产成人av在线| 狠狠色丁香婷婷综合久久片| 国产亚洲精品v| 国产精品久久久久久av下载红粉| 欧美精品久久天天躁| 蜜臀av性久久久久蜜臀aⅴ| 久久亚洲一区二区三区四区| 久久精品国产69国产精品亚洲| 午夜精品区一区二区三| 亚洲欧美国产精品桃花| 亚洲影视九九影院在线观看| 一区二区三区国产在线观看| 亚洲美女黄色片| 亚洲理论在线| 亚洲精品国产精品国自产在线| 亚洲激情二区| 亚洲国产婷婷综合在线精品| 尤物yw午夜国产精品视频| 黄色日韩网站视频| 精品福利电影| 在线日韩中文| 91久久精品国产91久久性色tv| 亚洲欧洲一区二区在线播放 | 欧美一区二区三区在线| 性欧美video另类hd性玩具| 性亚洲最疯狂xxxx高清| 欧美一级视频| 久久精品国产91精品亚洲|