C 雜談 C 指標

2021-07-31 16:54:48 字數 2526 閱讀 9004

1.何為指標:

程式執行時,任何變數都是存放在記憶體中的,通過將記憶體以位元組的大小劃分,為每個位元組增添索引,某一變數的位址就是該變數在記憶體中所佔的第乙個位元組的索引。此時,定義一變數用來存放開始第乙個位元組的索引,這個變數就被稱為指標,通過該變數的值可以間接的訪問該指標所指向的變數。在32位系統中,指標的大小都是4位元組,可以索引最大4g的記憶體。

2.指標定義

int a = 10;

int*p = &a;

int b[3] = ;

int*p = b;

3.常見指標型別的識別

// *的優先順序最低,當型別比較複雜時,一步一步的進行分析,還可以將某一部分看作整體進行簡化分析

int p;

int*p; // p與*結合,說明p是乙個指標,再與int結合,說明p是乙個指向int的指標

int p[3]; // p與結合,說明p是陣列,再與int結合,說明p是乙個存放int變數的陣列

int*p[3]; // p與結合,說明p是乙個陣列,再與*結合,說明陣列中存放的是指標,指標型別是int,說明p是乙個指向存放int型指標陣列的指標

int (*p)[3]; // p與*結合,說明p是指標,再與結合,說明p指向乙個陣列,該陣列裡存放int

int**p; // p是乙個只想int指標的指標

int p(int); // p是乙個函式,該函式引數為int,返回型別為int

int (*p)(int); // p是乙個指標,該指標指向乙個函式,函式引數為int,返回型別為int

int*(

*p(int))[3]; // p是乙個函式,該函式引數為int,返回型別為乙個指標,該返回型別的指標指向乙個陣列,次數組中存放的是int的指標

4.指標基本概念

指標的型別:把指標名去掉後的型別就是指標的型別,比如int prt的型別就是int

5.指標運算

指標可以加上或減去乙個整數,計算時,以指標所指向的型別大小為單位。

例如: 

typea *ptr;

unsigned

int addra = (usigned int)ptr;

unsigned

int addrb = (usigned int)(ptr + 1);

unsigned

int ret = addrb - addra;

char a[20] = " you_are_a_girl";

char *p = a;

char **ptr = &p;

printf("**ptr=%c\n", **ptr);// y

ptr++;

printf("**ptr=%c\n", **ptr);// 未定義

ptr為二級指標,*ptr等同於p,p指向a[0],則**ptr = 『y』

ptr為二級指標,ptr指向p,也就是ptr存放的是p的位址,對ptr自增,相當於&p + sizeof(char ),並不指向a中的任何資料,行為未定義

6.指標表示式

如果乙個表示式的結果是乙個指標,則這個表示式稱為指標表示式。 

例:  

char *str[3] = ; 

chars[80];

strcpy(s, str[0]); //也可寫成 strcpy(s,*str);

strcpy(s, str[1]); //也可寫成 strcpy(s,*(str+1));

指標型別轉換:

不同的指標之間可以強制轉換,也可以將整形當作乙個位址強制轉換為某一型別的指標。型別強制轉換時需要保證源指標指向的型別所佔位元組不比轉換後的型別小,否則可能造成越界。  

struct st_type ;

struct st_type st = ;

struct st_type *stptr = &st;

int *p = (int *)stptr;

(*p) = 1;    // 給a重新賦值

*(p + 1) = 3;  // 給b重新賦值

*(p + 2) = 5;  // 給c重新賦值

在使用時,可能會由於位元組對齊的原因導致通過上述方式訪問是發生錯誤,使用前必須人為指定位元組對齊的大小,比如:

#pragma pack(push) //儲存對齊狀態

#pragma pack(4)//設定為4位元組對齊

struct st_aaaa;

#pragma pack(pop)//恢復對齊狀態

C語言雜談 指標篇

指標是c語言的難點,其原因是它擁有多重的含義。這給已熟練理解c語言指標精髓的程式設計師帶來的好處是,可以天馬行空的構建軟體。但很不幸,我不是那些能夠熟練理解並天馬行空利用c指標的一員。對於我來說,是不是指標只有置之高閣了呢?答案是否定的,我們前面說過 c指標成為難點的原因是因為它擁有多重含義 這讓我...

C語言雜談 指標篇

指標是c語言的難點,其原因是它擁有多重的含義。這給已熟練理解c語言指標精髓的程式設計師帶來的好處是,可以天馬行空的構建軟體。但很不幸,我不是那些能夠熟練理解並天馬行空利用c指標的一員。對於我來說,是不是指標只有置之高閣了呢?答案是否定的,我們前面說過 c指標成為難點的原因是因為它擁有多重含義 這讓我...

C 雜談之 指標與陣列 一

c 雜談之 指標與陣列 一 思維導圖 介紹 1 指標定義 指標是儲存變數位址的變數。2 本文重點 指標與 陣列之間的關係 操縱指標的規則 3 指標優點 表達某個計算的唯一途徑 更高效,更緊湊 4 指標缺點 難以理解,但是用好了,會非常清晰。5 將指標 陣列和位址的算術運算整合在一起是c語言的一大優點...