iT邦幫忙

2021 iThome 鐵人賽

DAY 26
1

指標可以進行許多運算,讓我們看看下面的例子:

#include<stdio.h>
int main(){
	int *p;
	int data[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
	p = &data[6];
	printf("p存放的位址: %p\n\n", p);
	printf("p存放的位址的值: %d\n\n", *p);
	p ++;
	printf("p存放的位址: %p\n\n", p);
	printf("p存放的位址的值: %d\n\n", *p);
	return 0;
} 

輸出結果:

程式解說:

  • 首先,我們先宣告一個指標變數 p 以及長度為 10 並已經存放數值的陣列
  • data[6] 的位址放入指標變數 p 中(指標指向 data[6]
  • 輸出指標變數 p 裡面存放的位址(也就是data[6] 的位址)以及存放位址的值
  • 指標變數 p 加一,代表位址移動了 4 bytes,因為我們宣告的是 int
  • 輸出指標變數 p 裡面存放的位址(現在是data[7] 的位址)以及存放位址的值

由以上例子也能驗證我們在陣列單元講到的-陣列使用連續記憶體位址

指標陣列

如果有一行宣告程式碼長這樣:
int *ptr[3];
因為 [] 的優先順序大於 *,表示這個陣列元素(有三個),都指向某個特定的資料型態(int),我們稱他為指標陣列。

來看一段程式碼:

#include<stdio.h>
int main(){
	int data[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
	int *p[3] = {data[0], data[1], data[2]};	
	printf("%d %d %d ", **p, **(p+1), **(p+2));
	return 0;
} 

以下是輸出結果:

程式說明:

  • 首先,先宣告一個二維陣列 data,其大小是 3*4,並宣告一個指標陣列,指向 data 每一列開頭。
  • 輸出陣列指標中所存放位址的值

我們可以看到,把陣列指標 p 印出後,會發現裡面放的位址指向的值,是二維陣列每一列開頭!

畫成圖會長這樣:

以前老師上課時有跟我們說:在陣列與指標這裡,*[] 在某種意義上是可以當成一樣的意思。
例如:在上面的程式碼中,**p 換成 *p[0]是一樣的。

指標的基本概念大致上講到這邊,明天,我們來看一個有一點點小困難的例子,希望透過那個例子,可以讓我們更了解指標!


上一篇
【Day 25】指標介紹(中)
下一篇
【Day 27】指標的範例講解
系列文
C 語言的簡單入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言