1. 程式人生 > >C語言難點解析之void *型別指標轉換成二級指標的操作

C語言難點解析之void *型別指標轉換成二級指標的操作

在群裡看到小夥伴貼了一段程式碼如下:

P為void *型別的指標,並且使用calloc分配好了記憶體,第二個紅框內的內容該怎麼理解呢?

我的理解是,這裡先將p強轉成型別為Base的二級指標,然後“*”表示解這個二級指標(取P的值),由於p是個二級指標,(const Base **) p就是P指向的之前calloc分配的那塊記憶體首地址,*(const Base **) p的值為之前malloc分配記憶體的值,*(const Base **)p = base ;就是將base的值賦給malloc分配的記憶體的值。所以最後*p 裡儲存的是base的值。

下面寫個demo驗證下我的想法:

#include <stdio.h>

#include <stdlib.h>
int main(void)
{
    int a = 100;
    void *p = malloc(sizeof(int));
    *(int **)p = &a;
    printf("the addr of a is %p\n",&a);
    printf(" *p is %p\n",(unsigned int *)*(int *)p);
    //(*(int *)p) 正好是&a的值,這個值是地址,所以還需要再強轉成int*型,最後再用*取值
     printf(" **p is %d\n",*((int *)(*(int *)p)));
    return 0;
}

結果如下:



相關推薦

C語言難點解析void *型別指標轉換二級指標操作

在群裡看到小夥伴貼了一段程式碼如下:P為void *型別的指標,並且使用calloc分配好了記憶體,第二個紅框內的內容該怎麼理解呢?我的理解是,這裡先將p強轉成型別為Base的二級指標,然後“*”表示解這個二級指標(取P的值),由於p是個二級指標,(const Base **

C語言筆試題——BOOL,int,float,指標型別的變數a 與“零”的比較

Bool型: if(a) if(!a) BOOL型,沒什麼好講的,無非就是true或false判斷 int型: if(0 == a) if(0 != a) float型: const float EPSILON=0.000001; if(abs(a)<=E

C語言學習筆記資料型別

1、整數型別 1.1 型別 型別 位數 short(或short int) 16位 int 16位或32位 long (或long int) 32位 long long(或long lo

C語言運算中的資料型別自動轉換原則

1、隱式轉換C在以下四種情況下會進行隱式轉換:        1、算術運算式中,低型別能夠轉換為高型別。        2、賦值表示式中,右邊表示式的值自動隱式轉換為左邊變數的型別,並賦值給他。        3、函式呼叫中引數傳遞時,系統隱式地將實參轉換為形參的型別後,

整型陣列處理演算法(十四)不用庫函式,用C語言實現將一整型數轉換字串

不用庫函式,用C語言實現將一整型數轉換成字串,如:int a=123456,轉換成"123456"。 如題,要求將一整型數轉換為字串。這裡要考慮的是整型數可能是負數、正數和0。 實現如下: char

學了指標沒學動態記憶體一切都白搭!C語言基礎教程記憶體管理

本文將講解 C 中的動態記憶體管理。C 語言為記憶體的分配和管理提供了幾個函式。這些函式可以在<stdlib.h>標頭檔案中找到。 在記憶體中動態地分配 num 個長度為 size 的連續空間,並將每一個位元組都初始化為 0。所以它的結果是分配了 n

第22節 C語言結構體結構體巢狀、結構體指標與結構體陣列的程式碼實現

結構體 #include <stdio.h> //第一步 struct Student { //學號 int no; //姓名 char name[20]; //性別 char

C++ 釋放指向類的void型別指標造成記憶體洩漏

先來看一段程式碼 #include <iostream> using namespace std; class A { public: A(){ cout << "A() ...." << endl; } ~A() {

C語言結構體指標訪問

《朱老師物聯網大講堂》學習筆記 網站:www.zhulaoshi.org #include<stdio.h> #include <string.h> struct test {     int a;     int b;     char c; };

C語言程式設計入門--第四章C語言基本資料型別

    導讀:C語言程式中經常涉及一些數學計算,所以要熟悉其基本的資料型別。資料型別學習起來比較枯燥,不過結合之前的記憶體概念,以及本節的位元組概念,相信資料型別也就不難理解了。本章從二進位制的基本概念開始,然後介紹機器語言通用的計算單位位元組,最後再介紹C語言中基本的資料型別及其基本概念。 &

C語言數組冒泡排序+折半查找法(二分查找)

不存在 次數 存在 是否 .com int count 結束 如果 冒泡排序算法 1 int num[5]; 2 int i; 3 //循環接收用戶輸入的元素 4 for(i=0;i<5;i++){ 5 pr

C語言的陷阱typedef

c語言的陷阱之typedeftypedef是一個關鍵字,可以重命名一些數據類型也可以重定義一些新的數據類型。我們從以下幾個角度去理解typedef。1.typedef和普通數據類型類型typedef int MYINT;int a = 10; MYINT B = 20;123123我們給int重命名成MYIN

C++語言筆記系列十八——虛函數(1)

自己 語言 數據類型 說明 出現 adium 重定義 angle rac 1.C++中的多態 (1)多態性:同一個函數的調用能夠進行不同的操作,函數重載是實現多態的一種手段。 (2)聯編:在編譯階段進行聯接。即是在編譯階段將一個函數的調用點和函數

C++語言筆記系列二十——模版

輸出 類模板 pos 有一個 class 初始 個數 創建對象 example 1.隨意輸入兩個數x和y,輸出最大值max。 int max(int x, int y) {return x>y?x:y;} 2.函數模版 (1)用一種或者多

C語言知識結構

等等 深入 代碼 技術 研究 pop tex dsm 其他 C語言的知識結構整理成思維導圖,例如以下圖所看到的: 這張圖的總體思路是: 用C敲代碼。該學會什麽? 要用C寫的更好,改學會什麽? 事實上。僅僅要是分層的知識結構,大致的思路是:

嵌入式C語言難點一:數組

數組 位置 scanf 列表 輸出結果 clu sort 難點 can 1.數組的定義   由若幹相同類型並且有順序關系的數組組成,數組中的每個變量就叫做這個數組的元素。   表達式:<儲存類型> <數據類型> <數組名> [<常量

C語言編程--scanf()函數與getchar()函數搭配來理解C程序的輸入緩存(buffer)

使用 ges border urn alt color 數值 amp tps 博主最近在學習C語言編程,在書中的代碼示例中出現了下面的代碼段: #include<stdio.h> int main() { char a[5]; int i; printf("

梓益C語言學習筆記常用鏈表操作函數

C語言 鏈表操作 梓益C語言學習筆記之常用鏈表操作函數一、創建鏈表void link_creat_head(STU **p_head,STU *p_new){ STU *p_mov=*p_head; if(*p_head==NULL) //當第一次加入鏈表為空時,head執行p_new { *

梓益C語言學習筆記鏈表&動態內存&文件

C語言 鏈表 梓益C語言學習筆記之鏈表&動態內存&文件一、定義: 鏈表是一種物理存儲上非連續,通過指針鏈接次序,實現的一種線性存儲結構。二、特點: 鏈表由一系列節點(鏈表中每一個元素稱為節點)組成,節點在運行時動態生成(malloc),每個節點包括兩個部分: 存儲數據元素的數據域 存儲下一個節點地址的

梓益C語言學習筆記常用字符串操作(sscanf & strtok)

C語言 字符串操作 梓益C語言學習筆記之常用字符串操作(sscanf & strtok)一、sscanf int sscanf(const char *buf,const char *format, …); \\從buf指定的內存區域中讀入信息 例: int a, b, c; ssc