1:結構體
結構體是一種自定義數據類型。聲明結構體時使用的關鍵字是struct,定義一種結構體的一般形式為:
struct 結構體名 { 成員列表; }
結構體類型與基本類型一樣,都是從C語言中繼承下來的,但是C++結構體與C語言結構體是有區別的,C語言中沒有繼承、成員函數等概念,所以C語言中的結構體成員只能包含C語言中的數據類型,不能包含成員函數;但是C++語言卻不是。
C++中的結構體的使用方法和類的使用方法幾乎一樣,它包含this指針,可以繼承也可以被繼承;創建、銷毀和復制時均調用相應的構造、析構和復制構造函數;它包含虛表,可以被抽象化...但有兩點不同,其一,結構體的默認訪問權限為public,而類中則是private;其二,結構體無法使用類模板。
2:數據類型別名——typedef
使用C++的typedef關鍵字可以將一個數據類型的名稱賦予別名,也可以將已經存在的別名賦予您的名字,例如:
typedef flag int;
這樣,程序中的flag就可以作為int的數據類型來使用,例如:
flag a;
a實質上是int類型的數據,此時int類型的別名就是flag。
在聲明類或者結構體時使用typedef關鍵字,例如:
typedef class asdfgh { 成員列表; }myClass,ClassA;
這樣就可以使聲明的類擁有myClass和ClassA兩個別名。
typedef的主要用途有如下兩個:
(1)定義很復雜的基本類型名稱,如函數指針int(*)(int i)。
typedef pFun int(*)(int i);
(2)使用其他人開發的類型時,使類型名符合自己的代碼習慣(規范)。
tpedef關鍵字具有作用域。范圍是別名聲明所在的區域(包含名稱空間)。
2:malloc函數
malloc函數是一種分配長度為num_bytes字節的內存塊的函數,可以向系統申請分配指定size個字節的內存空間。malloc的全稱是memory allocation,中文叫動態內存分配,當無法知道內存具體位置的時候,想要綁定真正的內存空間,就需要用到動態的分配內存。
返回類型是 void* 類型。void* 表示未確定類型的指針。C,C++規定,void* 類型可以通過類型轉換強制轉換為任何其它類型的指針。
(1)原型:
extern void *malloc(unsigned int num_bytes);
(2)頭文件:
#include <stdlib.h>
或者
#include <malloc.h>
void *malloc(size_t size);
int *p; p = new int; //返回類型為int *類型(整數型指針),分配大小為sizeof(int);
或
int *parr; parr = new int[100]; //返回類型為int *類型(整數型指針),分配大小為sizeof(int) * 100;
而 malloc 則必須要由我們計算字節數,並且在返回后強行轉換為實際類型的指針。
int *p; p = (int*)malloc(sizeof(int) * 128); //分配128個(可根據實際需要替換該數值)整型存儲單元, //並將這128個連續的整型存儲單元的首地址存儲到指針變量p中 double *pd = (double*)malloc(sizeof(double) * 12); //分配12個double型存儲單元, //並將首地址存儲到指針變量pd中
type *p; if(NULL == (p = (type*)malloc(sizeof(type)))) /*請使用if來判斷,這是有必要的*/ { perror("error..."); exit(1); } .../*其它代碼*/ free(p); p = NULL;/*請加上這句*/
int *p = (int*)malloc(sizeof(int) * 100); //分配可以放得下100個整數的內存空間。

// ConsoleApplication15.cpp : 定義控制台應用程序的入口點。 // #include "stdafx.h" #include <malloc.h> typedef struct node//定義鏈表結構體 { int data;//節點內容 node *next;//指向結構體的指針,下一個節點 }node; node *create()//創建單鏈表 { int i = 0;//鏈表中數據的個數 node *head, *p, *q;//這些的本質是節點的地址 int x = 0; head = NULL; q = NULL;//初始化q,q代表末節點 p = NULL; while (1) { printf("please input the data:"); scanf_s("%d", &x); if (x == 0) break;//data為0時創建結束 p = (node *)malloc(sizeof(node));//用於每次輸入鏈表的數據 p->data = x; if (++i == 1)//鏈表頭的指針指向下一個節點 { head = p; q = p; } else { q->next = p;//連接到鏈表尾端 q = p; } q->next = NULL;/*尾結點的后繼指針為NULL(空)*/ } return head; } int length(node *head) { int len = 0; node *p; p = head->next; while (p != NULL) { len++; p = p->next; } return len; } void print(node *head) { node *p; p = head; while (p)/*直到結點q為NULL結束循環*/ { printf("%d ", p->data);/*輸出結點中的值*/ p = p->next;/*指向下一個結點*/ } } int main() { node *head = create();//創建單鏈表 printf("Length:%d\n", length(head)); print(head); return 0; }
