C指標原理(18) C指標基礎

2021-09-17 22:56:42 字數 3265 閱讀 7266

5、指標陣列

指標陣列就是陣列裡存放的是指標。

#include int main(void)

for (i=0;i<10;i++)

return 1;

}

上面定義了乙個指標陣列,陣列的每個元素都是指標,每個指標指向x陣列的相應元素。

其中,p_x為指標陣列,通過for迴圈中的p_x[i]=x+i完成指標陣列每個元素的賦值。這裡也可以寫成p_x[i]=&x[i]。最後以陣列下標的方式訪問陣列,輸出元素。

我們讓這個程式更複雜一些,加入指標的指標。

定義pp_x,讓它指向指標陣列的第乙個元素,然後向後移動指標,輸出元素。源程式如下:

#include

int main(void)

char **pp_x=null;

for (i=0;i<10;i++)

printf ("\n");

for (pp_x=p_x;pp_x<(p_x+10);pp_x++)

return 1;

}執行程式

myhaspl@myhaspl:~ % make

cc test4.c -o mytest

myhaspl@myhaspl:~ % ./mytest

a b c d e f g h i j

a b c d e f g h i j

最後我們定義乙個更複雜的例子,指標的指標的陣列,名字有些長。在例子的最後**使用了指向指標的指標的指標***ppp_x,用它來最後輸出10個元素中的5個元素(每隔乙個元素輸出乙個元素。類似的還使用temp_x,原理類似。

myhaspl@myhaspl:~ % vim test4.c

#include int main(void)

char ***temp_x=pp_x;

for (i=0;i<10;i+=2)

printf ("\n");

char ***ppp_x;

for (ppp_x=pp_x;ppp_x<(pp_x+5);ppp_x++)

return 1;

執行程式

myhaspl@myhaspl:~ % make clean

rm mytest

myhaspl@myhaspl:~ % make

cc test4.c -o mytest

myhaspl@myhaspl:~ % ./mytest

a c e g i 程式每隔乙個元素對x陣列的內容進行輸出。

5、函式引數中使用指標

指標也是一種變數,其實,c語言的函式還是傳值,所謂傳址只是把指標值傳給函式而已,本質上仍然是傳值,如下面程式,交換兩個數字

#include int main(void)

int myswap(int *a,int *b)

執行後,x和y的值交換了。

myhaspl@myhaspl:~ % make clean

rm mytest

myhaspl@myhaspl:~ % make

cc test5.c -o mytest

myhaspl@myhaspl:~ % ./mytest

x:30-y:50

myhaspl@myhaspl:~ %

我們定義乙個陣列,然後將陣列指標做為引數進行傳遞。

下面是一段程式完成引數陣列中所有元素之和。

#include int x[5]=;

int main(void)

int mysum(int length,int *data)

上面程式中當x值可用1個位元組容納時,程式執行正常。

myhaspl@myhaspl:~ % ./mytest

127myhaspl@myhaspl:~ % make

cc test5.c -o mytest

myhaspl@myhaspl:~ % ./mytest

但當x值較大時(不在-128~127以內),就會出問題:

#include int main(void)
myhaspl@myhaspl:~ % make

cc test5.c -o mytest

myhaspl@myhaspl:~ % ./mytest

-6m多維陣列的指標定定義比一維陣列更錄活,因為它可以指定指向變數的最後一維的維數,下面定義的指標指向變數的大小是最後一維的5個元素,每次指標移動都以5個元素為單位:

#include int main(void);

int (*p_x)[5];

for (p_x=x;p_x<=(&x[1]);p_x++)

return 1;

}

myhaspl@myhaspl:~ % make

cc test6.c -o mytest

myhaspl@myhaspl:~ % ./mytest

1 6下面定義的指標僅指向乙個元素 ,也通過改變指標指向變數的尺寸,將陣列以5*2大小的方式進行訪問,這樣,編譯器會給出警告,但能編譯通過。

#include int main(void);

int (*p_x)[2];

for (p_x=x;p_x<&x[1][5];p_x++)

return 1;

}

myhaspl@myhaspl:~ % cc test8.c -o mytest

test8.c: in function 『main』:

test8.c:7: warning: assignment from incompatible pointer type

test8.c:7: warning: comparison of distinct pointer types lacks a cast

myhaspl@myhaspl:~ % ./mytest

1 3 5 7 9

並不贊成這種做法,如果需要每隔2個元素進行訪問,可以將指標指向多維陣列的乙個元素,每次移動加上2即可。

#include int main(void);

int *p_x=&x[0][0];

for (;p_x<&x[1][5];p_x+=2)

return 1;

}

myhaspl@myhaspl:~ % cc test7.c -o mytest

myhaspl@myhaspl:~ % ./mytest

1 3 5 7 9

18 C 基礎 函式指標

int p1 10 p1 是乙個陣列,含有 10 個指標的陣列 int p2 10 arr p2 是乙個指標,指向含有 10 個整數的陣列 bool pf const string const string pf 是乙個函式,該函式返回為bool指標的函式,即返回bool bool pf const...

18 c 排序心得

注意開始時不合法判斷if i j return 三個while迴圈void quicksort vector int data,int left,int right data i temp print data quicksort data,left,i 1 quicksort data,i 1,r...

18 C 友元函式

c 成員變數或者成員函式如果具有私有或者受保護屬性,客戶程式設計師是無法通過物件直接呼叫私有 受保護的部分 受保護的成員可以通過公有的成員函式暴露給客戶程式設計師,或者使用非成員函式 即友元函式暴露 include using namespace std class stack 公有屬性,成員函式暴...