1. 程式人生 > >結構體定義、結構體指標、記憶體分配、指標、結構體形參的深入理解

結構體定義、結構體指標、記憶體分配、指標、結構體形參的深入理解



說明:此程式為深入學習資料結構時候,對於資料結構最重要的基礎(結構體、指標、記憶體分配) 方面的一些理解,我自己通過這段程式說明一些自己得到的結論;希望對看到這篇程式的c愛好者 有幫助,如果有理解錯誤的地方希望各位聯絡我,一起討論學習.說實話,我學習c就半年吧,除了 上課自學的,發現最難的部分就是指標了.廢話留在看了程式過後再說哈!為了方便我就在vc++ 上面編譯執行的,我沒有發現問題哈!程式的說明外加我自己的理解就在後面了: 

考慮: 
1.結構體指標變數與結構體變數怎樣定義(typedef 有什麼用處呢?與define有什麼區別?) 
2.分配記憶體有malloc或者realloc等有什麼區別 
3.結構體變數名與結構體變數指標名代表什麼?和陣列名一樣代表首地址麼 
4.結構體內的成員指標變數或者結構體指標變數是不是可以不初始化,如果要應該怎樣初始化 
5.結構體指標變數與結構體變數怎樣引用結構體成員變數的 
6.結構體與結構體指標用於怎樣用於實參與形參的傳遞 
7.結構體定義過後就給結構體中的變數分配記憶體還是等待malloc分配呢 


請看程式吧:
 
**************************************************************************/ 
#include<stdio.h> 
#include<stdlib.h> 

#define STACK_SIZE 1 
typedef int ElemType; 

//定義結構體// 
typedef struct sqstack 

ElemType *bottom; 
ElemType *top; 
int stacksize; 
}SqStack; 

//用於後面結構體形參的傳遞測試// 
void teststruct (SqStack *M) 

printf("M->stacksize=%d\n",M->stacksize); //觀察形參傳遞是否正確 
M->stacksize++; 
printf("M->stacksize=%d\n",M->stacksize); //輸出棧內的值 


void main() 

SqStack *S=NULL; //定義結構體指標,並初始化 
SqStack *G=NULL; //定義結構體指標 
SqStack P;//定義結構體 
SqStack Q;//定義結構體 
SqStack F;//定義結構體 

/************第一 結構體指標部分*************/ 

S=(SqStack *)malloc(STACK_SIZE*sizeof(SqStack)); //為結構分配一個空間大小的記憶體 
S->top=(ElemType *)malloc(STACK_SIZE*sizeof(ElemType)); //初始化結構體指標變數 
S->bottom=(ElemType *)malloc(STACK_SIZE*sizeof(ElemType)); //初始化初始化結構體指標變數 
/* 結構體變數賦值*/ 
*S->bottom=5; 
S->stacksize=6; 
*S->top=7; 

//值的輸出 
printf("*S=%d\n",*S); //結構體第一個變數值的地址值,即S->bottom 
printf("*S->bottom=%d\n",*S->bottom); //變數*bottom的值 
printf("*S->top=%d\n",*S->top); //變數*top的值 
printf("S->stacksize=%d\n\n",S->stacksize); //變數stacksize的值 

//地址輸出 
printf("&S=%d\n",&S); //即存放第一個變數值地址的地址的地址 
printf("S=%d\n",S); //存放第一個變數值地址的地址 
printf("S->bottom=%d\n",S->bottom);//*S->bottom的地址 
printf("&S->bottom=%d\n",&S->bottom);//S->bottom的地址 
printf("S->top=%d\n",S->top);//*S->top的地址 
printf("&S->top=%d\n",&S->top);//S->top的地址 
printf("&S->stacksize=%d\n",&S->stacksize);//S->stacksize的地址 

printf("\n\n\n"); 

/****************第二 結構體部分*****************/ 
/*結構體變數賦值*/ 
P.top=(ElemType *)malloc(STACK_SIZE*sizeof(ElemType)); //初始化 
P.bottom=(ElemType *)malloc(STACK_SIZE*sizeof(ElemType)); //初始化 

*(P.bottom)=5; 
*(P.top)=6; 
P.stacksize=7; 
//值的輸出 
printf("P=%d\n",P);//P代表第一個變數地址存的值,由於第一變數是指標,所以存的是指標變數的地址p.bottom 
printf("*P.bottom=%d\n",*P.bottom);//指標變數的值 
printf("*P.top=%d\n",*P.top);//指標變數的值 
printf("P.stacksize=%d\n\n",P.stacksize);//結構體變數的值 
//地址輸出 
printf("&P=%d\n",&P);//P的地址 
printf("P.bottom=%d\n",P.bottom);//*P.bottom的地址 
printf("&P.bottom=%d\n",&P.bottom);//P.bottom的地址 
printf("&P.top=%d\n",&P.top);//P.top的地址 
printf("P.top=%d\n",P.top);//*P.top的地址 
printf("&P.stacksize=%d\n",&P.stacksize);//P.stacksize的地址 

printf("\n\n\n"); 

/**************第三 結構體作為形參***************/ 

Q.stacksize=20; //結構體賦值 
teststruct(&Q); //函式呼叫處理 
printf("Q.stacksize=%d\n",Q.stacksize); //再次輸出值觀察是否變化 

printf("\n\n\n"); 

/**************第四 結構體指標作為形參************/ 

G=(SqStack *)malloc(STACK_SIZE*sizeof(SqStack)); //為結構分配一個空間大小的記憶體 
G->stacksize=30; //結構體賦值 
teststruct(G); //函式呼叫處理 
printf("G->stacksize=%d\n",G->stacksize); //再次輸出值觀察是否變化 
printf("\n\n\n"); 

/**************第五 結構體定義過後會產生的現象************/ 

printf("&F=%d\n",&F);//結構體名地址 
printf("&F.bottom=%d\n",&F.bottom);//F.bottom地址 
printf("&F.stacksize=%d\n",&F.stacksize);//F.stacksize地址 
printf("&F.top=%d\n",&F.top);//F.top地址 

/**************第六 重點理解指標*********** 
暫時沒寫 
*/ 
/**************第七 理解指標函式與函式指標*********** 
暫時沒寫 
*/ 

相關推薦

結構指標陣列 記憶體分配 釋放

#include <iostream> #include <vector> #include <map> #include <iterator> #include <algorithm> using namesp

C++記憶體分配方式-堆靜態儲存區常量儲存區

C++中,記憶體分為5個區:堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。棧:是由編譯器在需要時自動分配,不需要時自動清除的變數儲存區。通常存放區域性變數、函式引數等。堆:是由new分配的記憶體塊,由程式設計師釋放(編譯器不管),一般一個new與一個delete對應,一個new[]與一個del

記憶體分配(堆BSS程式碼段資料段)

這兩天看了馬士兵老師的視訊、視訊中提到了一個萬能鑰匙、就是了解程式執行中對記憶體的操作、主要講了堆、棧、Data、說真的有點暈、看了兩遍、也就略懂一二、在這做個小小知道總結 簡介        

Java記憶體分配(堆棧和常量池)

Java記憶體分配主要包括以下幾個區域:1. 暫存器:我們在程式中無法控制2. 棧:存放基本型別的資料和物件的引用,但物件本身不存放在棧中,而是存放在堆中3. 堆:存放用new產生的資料4. 靜態域:存放在物件中用static定義的靜態成員5. 常量池:存放常量6. 非RAM

動態記憶體分配(mallocfreecallocrealloc)

1. void*   malloc(size_t size);     //size_t   size表示的是記憶體的總大小 a、malloc所分配的是一塊連續的記憶體,以位元組為單位,並且不帶任何資訊 b、malloc實際分配的記憶體可能比請求的稍微多一點(什麼原因呢?思

陣列記憶體分配之堆

首先看一下陣列: 陣列是儲存同一種資料型別多個元素的集合。也可以看成是一個容器。 陣列既可以儲存基本資料型別,也可以儲存引用資料型別。 陣列的定義格式: 格式1:資料型別[]  陣列名;int[

C語言記憶體分配:malloccallocrealloc

大家都知道程式在記憶體中的佈局分為:棧區、堆、靜態變數區、常量區等幾個部分。其中堆上的空間分配是由程式設計師自己來管理的,包括空間的申請和釋放。 我們這裡就說一下C標準庫中提供的幾個在堆上操作空間的函式: 1、void*malloc(unsigned size); 2

動態記憶體分配(mallocrealloccalloc函式)

一、關於動態記憶體分配的定義(用時分配,不用釋放)所謂動態記憶體分配,就是指在程式執行的過程中動態地分配或者回收儲存空間的分配記憶體的方法。動態記憶體分配不象陣列等靜態記憶體分配方法那樣需要預先分配儲存

Linux記憶體分配小結--mallocbrkmmap

http://blog.163.com/[email protected]/blog/static/132229655201210975312473/ http://blog.sina.com.cn/s/blog_7c60861501015vkk.html Linux 的虛擬記憶體管理有幾個關鍵

常見動態記憶體分配malloc()/free()new/delete使用方法及常見錯誤

1.動態記憶體分配的幾種方式 ①從靜態儲存區分配記憶體,記憶體在編譯時已經分配好了,這塊記憶體在整個程式執行期間都存在,比如全域性變數 ②從棧上分配記憶體,函式體結束時,棧記憶體自動銷燬,比如區域性變數 ③從堆上開闢記憶體,比如malloc()/ne

簡述CC++程式編譯的記憶體分配情況

C、C++中記憶體分配方式可以分為三種 1.從靜態儲存區域分配: 記憶體在程式編譯時就已經分配好,這塊記憶體在程式的整個執行期間都存在速度快,不容易出錯,因為有系統會善後。例如全域性變數,static變數等。 2.在棧上分配:

JVM面試題整理-Java記憶體區域與記憶體溢位異常垃圾收集器和記憶體分配策略

1、Java虛擬機器記憶體(執行時資料區域)的劃分,每個區域的功能 關於JVM 執行時記憶體劃分的例項參考: http://www.cnblogs.com/hellocsl/p/3969768.html?utm_source=tuicool&

C語言基礎及指標⑤動態記憶體分配

接續上篇C語言基礎及指標④函式指標 在上一篇我們瞭解C語言中的函式及函式指標 , 使用函式指標 , 模擬了網路請求的回撥方式 , 今天我們來學習動態記憶體分配。 我們在使用java的時候 , 所有的記憶體都交由JVM做處理 , 我們無法直接控制 , 雖然很少導致記憶體溢位 , 但是程式佔用記

delphi 指標記憶體分配和釋放

給字元指標(PChar、PWideChar、PAnsiChar)分配記憶體, 最佳選擇是: StrAlloc.StrAlloc 雖然最終也是呼叫了 GetMem, 但 StrAlloc 會在指標前面新增 Delphi 需要的 4 個管理位元組(記錄長度).StrAlloc

C語言,指標記憶體分配

指標變數與記憶體分配 1. char * str1; //str1 只是一個指標,指標指向的空間還沒有分配,所以此時用strcpy向str1所指向的記憶體 中拷貝內容將出錯。利用malloc動態分配指向的記憶體(在堆中): str1=(char *)malloc(10) or str1=(char *)ma

C語言 記憶體分配 地址 指標 陣列 引數 例項解析

指標簡介 : 指標式儲存變數地址的變數; -- 增加閱讀難度 : 指標 和 goto 語句會增加程式的理解難度, 容易出現錯誤; -- ANSI C : American National Standards Institute 美國國家標準學會, 即標準

結構定義結構指標記憶體分配指標結構體形深入理解

說明:此程式為深入學習資料結構時候,對於資料結構最重要的基礎(結構體、指標、記憶體分配) 方面的一些理解,我自己通過這段程式說明一些自己得到的結論;希望對看到這篇程式的c愛好者 有幫助,如果有理解錯誤的地方希望各位聯絡我,一起討論學習.說實話,我學習c就半年吧,除了 上課自學的,發現最難的部分就是指標了.廢話

C語言之_指標陣列結構動態記憶體分配

1、sizeof() int main() { int a[20]; int count=sizeof(a)/sizeof(int); printf(“%d\n”,count); return 0; } 2、指標陣列

C語言一條語句完成結構定義變數建立成員初始化

struct { struct nlmsghdr nlh; struct netlink_diag_req ndr; } req = { .nlh = { .nlmsg_len = sizeof(req), .nlm

結構公用枚舉

std 例如 每一個 指針變量 .... 需要 整體 ont 判斷 一.結構體類型  1.結構體變量的定義與使用   ? 定義結構體變量的方式     ? 先申明結構體類型再定義變量名       struct stu  //stu:結構體類型名       {