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