C學習 const修飾 結構體指標及位域使用

2021-08-20 17:52:43 字數 2877 閱讀 2541

const

int nvalue; // nvalue是const

const

char *pcontent; // *pcontent是const, pcontent可變

const

char* const pcontent; // pcontent 和 *pcontent都是const

int

const nvalue; // nvalue是const

char

const * pcontent; // *pcontent是const, pcontent可變

char* const pcontent; // pcontent是const, *pcontent可變

char

const* const pcontent; // pcontent 和 *pcontent都是const

根據上面的例子和注釋簡單總結為:const跳過其後的資料型別修飾其後的變數(括號可以限定修飾範圍)

如上面的const char *pcontent; 語句,const修飾後面的「*pcontent」,故而*pcontent是const的;

又如語句「char* const pcontent; 」,const修飾其後的「pcontent」,故而pcontent是const的。

通過結構體指標變數獲得其結構體變數的成員變數有兩種方式:

其中,「.」為取結構體成員變數的運算子。

另外c語言中引入了新的運算子「->」用於結構體指標變數直接獲得結構體變數的成員變數

typedef struct birthday   

birthday_t;

typedef struct stu

stu_t;

int main()

; stu_t *pstu; /*定義結構體型別指標*/

//pstu = malloc(sizeof(stu_t)); /*為指標變數分配安全的位址*/

printf("input name, number, year, month, day:\n");

scanf("%s", student.name);

scanf("%ld", student.num);

...pstu = &student;

student.name = "wangerqiang" /* error */

...}

(*pstu).num = student.num

;(*pstu).birthday

.year = student.birthday

.year

;等價於

pstu->num = student.num

;pstu->birthday.year = student.birthday

.year

;

另外語句student.name = 「wangerqiang」編譯報錯,需要注意的是student.name是陣列名,代表陣列的首位址(位址常量),給常量賦值是非法的。

int main()

; stu_t *pstu; /*定義結構體型別指標*/

...pstu = &student;

...pstu++;

...}

以上程式對結構體陣列student元素的引用可採用三種方法:

student+i和pstu+i均表示陣列第i個元素的位址,陣列元素成員的引用形式為:

(student+i)->name, (student+i)->num 和 (pstu+i)->name, (pstu+i)->num等.

student+i 和 pstu+i 及 &student[i]意義相同。

若pstu指向陣列的某乙個元素,則pstu++

就指向其後續元素。

pstu = &student,pstu指向陣列student,pstu[i]表示陣列的第i個元素,其效果與student[i]等同。

對數組成員的引用描述為:pstu[i].name, pstu[i].num。

typedef

struct

u16bitfield_type;

typedef

struct

u8bitfield_type;

int main()

; u8bitfield_type struc8 = ;

unsigned

short *pu16 = null;

unsigned

char *pu8 = null;

struc16.u16_1 = 0x0a98;

struc16.u16_2 = 0x000f;

pu16 = &struc16;

struc8.u8_1 = 0x3a;

struc8.u8_2 = 0x03;

pu8 = &struc8;

printf("struc16.u16_1:0x%x struc16.u16_2:0x%x *pu16:0x%x \n", struc16.u16_1, struc16.u16_2, *pu16);

printf("struc8.u8_1:0x%x struc8.u8_2:0x%x *pu8:0x%x \n", struc8.u8_1, struc8.u8_1, *pu8);

return

0;}

結果是*pu16 = 0xfa98; *pu8 = 0xfa;

注:測試處理器環境為小端

const修飾指標

1.指向const資料的非const指標 const int countptr 這個宣告從左到右讀,countptr 是乙個指向整數常量的指標 2.指向非const資料的const指標 int const ptr x 這個ptr指標就是const指標,宣告為const的指標必須在宣告時進行初始化。指...

const修飾指標

書寫形式為 int countptr 特點 指標的指向可以被修改,指向的資料可以被修改 includeint main 書寫形式為 const int countptr 特點 指標的指向可以被修改,指向的資料不能被修改 includevoid func const int int main void...

C 指標基礎之const修飾指標

一.const修飾指標有三種情況 1.const修飾指標 常量指標 2.const修飾常量 指標常量 3.const既修飾指標又修飾常量 二.特點 常量指標 指標的指向可以修改,但是指標指向的值不可以修改。int a 20 const int p a 常量指標指標常量 指標的指向不可以修改,但是指標...