爬爬爬之路 C語言 九 結構體指標與預編譯指令

2021-07-06 01:07:36 字數 1999 閱讀 9820

結構體是一種自定義的資料型別

結構體的指標和基礎資料型別差不多 結構體變數名不能當成它的首元素位址 需要用取位址符獲得結構體變數的位址, 但是結構變數的位址就相當於指向結構體變數的第乙個成員變數的位址

如以下**演示:

typedef

struct student;

student student = ;

student *p = &student;

用結構體獲取成員變數的方法:(點方法)

student.name

用指標獲取結構體變數裡的成員變數方法(常規)

(*p).name

結構體指標特有的取成員變數方法( -> 指向符)

p -> name// 位址指向成員變數

結構體指標加一, 相當於加了乙個整個的結構體的位元組數

先建立乙個結構體陣列

student stus[3] = ;

student *p = suts;

printf(「%p\n」, p);

printf(「%p\n」, &stus[0]);

結構體指標指向結構體陣列, 就相當於指向結構體陣列的首元素

如何利用指標 取出陣列中的元素?

請看以下**:

void printstudent(student *stu) 

void printstudents(student *stu, int count)

}

在main函式中呼叫如下:

student stu1 = ;

student stu2 = ;

student stu3 = ;

student stus = ;

student *s = stus;

printstudents(s, 3);

定義乙個指標指向結構體陣列的位址, 通過 s + i 可以實現指向陣列第i個元素

使用語法 *(s + i)可以將陣列第i個元素取出

巨集定義是替換的過程

#define 替換前的名字 替換後的名字 (把前者替換成後者)

比如**#define pi 3.14

作用是將**中所有的pi 替換成 浮點數3.14

#define maxvalue(a,b) a > b ? a : b

比如此段**就是乙個典型的帶引數的巨集定義, 作用是計算兩個數之間的最大值. 值得注意的是, 這麼寫可以使得替換語句 a > b ? a : b中的變數a,b隨著引數中的a,b一同被替換,替換的元素為主函式中輸入的實參

#ifdef xy

printf("xy這個巨集定義, 已經定義了")

#else

printf(「xy這個巨集定義 還沒定義");

#endif

應用場景

#ifdef pi  // 如果定義過pi

#define aers(r) pi*(r)*(r) // 進行巨集替換

#else // 如果沒有定義過`

#define aers(r) 3.14*(r)*(r) // 用另一種巨集替換

#endif

#ifndef pi

printf("這個pi, 還沒定義過")

#else

printf(「這個pi, 已經定義過了");

#endif

與條件編譯模式1的意思正好相反

#if 常量表示式

**段1

#else

**段2

#endif

如果常量表示式結果非0 編譯器編譯**段1, 否則編譯**段2

在上線和測試兩個階段切換的時候會經常用到

爬爬爬之路 結構體的初始化及結構體陣列的初始化

定義結構體如下 typedef struct mypoint mypoint 一 結構體變數的初始化 通常不能直接用結構體自身對自己進行賦值,需通過結構體的變數來進行初始化 如 1.mypoint p p.x 5 p.y 6 這是宣告和賦值分離 2.也可宣告的同時進行賦值 mypoint p 3.當...

爬爬爬之路 C語言 五 二維陣列篇

二維陣列 的宣告,第乙個中括號代表行數,第二個中括號代表列數 建議宣告格式如下 intarray 3 4 二維陣列的遍歷 intarray 4 5 初始化為0,即array陣列中共 4 5 20 個元素的初始值均為0 for inti 0 i 4 i for int i 0 i 4 i printf...

爬爬爬之路 OC語言 一 語法簡介

oc是對c語言的擴充.c語言的弊端 維護公升級十分複雜 物件導向的特點 封裝 繼承 多型 什麼是物件 萬物皆物件 是c語言的超集,允許在oc中使用c語言的源 編譯器相容c語言程式 具備完善的物件導向特性 包含乙個執行時系統 類庫豐富 指開發人員寫的類庫 分析物件是最重要的一環,是保證程式的擴充套件性...