C語言 指標與陣列

Claroja發表於2019-03-27

基礎

  1. 陣列名=陣列首元素指標
  2. 用陣列名的解引用buf來訪問第一個元素,也可以使用(buf+N)來訪問第N個元素。

陣列指標(型別為元素,型別為整個陣列)和指標陣列

  1. 指向陣列的指標常被簡稱為陣列指標(array pointer),包含兩種情況一個是指向元素的首個元素地址,另一個是指向整個陣列,雖然二者地址值相同,但是指標型別不同.
  2. 而具有指標型別元素的陣列則被稱為指標陣列(pointer array)
  3. 主要應用是陣列指標的第一種,既指向陣列首元素的指標
#pragma warning(disable:4996)

# include <stdio.h>
# include <stdlib.h>
void main() {
	int a[5] = { 1,2,3,4,5 };
	printf("%x,%x", a, &a); // a和&a的地址是相同的,既陣列名=陣列首元素指標
	printf("\n%d,%d", sizeof(*a), sizeof(*(&a))); // 但是a指標型別(*a)是陣列的一個元素,而&a指標型別*(&a)是整個陣列
	int *p1 = a;//指向元素的指標,每個元素佔四個位元組
	int(*p2)[5] = &a;//指向陣列的指標,記憶體長度是所有元素的和//區別於int *p2[5],這個是建立了一個陣列,陣列的元素全是指標
	printf("\n%d,%d", sizeof(*p1), sizeof(*p2)); //和sizeof(*a), sizeof(*(&a))等價
	system("pause");
}

參考:http://c.biancheng.net/view/368.html

陣列指標(元素)

陣列變數名既是指標

  1. p=&a; //將變數地址賦值給指標
  2. p=array; //將陣列地址賦值給指標
  3. p=&array[i]; //將陣列元素賦值給指標
  4. p1=p2; // 將指標地址賦值給指標
#pragma warning(disable:4996)

# include <stdio.h>
# include <stdlib.h>
void main() {
	int arr[10] = { 10 };//陣列名是陣列的首地址,是一個常量,它就是一個指標
	for (int i = 0; i < 10; i++) {
		printf("%d\n", arr[i]);//因為陣列名=陣列首元素指標,既arr就是一個指標型別,其大小是陣列第一個元素大小
	}
	int* p = arr;
	for (int i = 0; i < 10; i++) {//指向陣列的指標,當操作指標的時候,間接操作
		printf("%d\n", p[i]);//和printf("%d\n", arr[i]);本質相同,因為陣列名=陣列首元素指標,既arr就是一個指標型別,其大小是陣列第一個元素大小
	}
	system("pause");
}

*(p+1)*p++

  1. 指標運算*(a+i)遍歷陣列
#pragma warning(disable:4996)

# include <stdio.h>
# include <stdlib.h>
void main() {
	int a[5] = { 1,2,3,4,5 };
	printf("陣列名地址:%x,陣列第一個元素地址:%x 相同\n", a,&a[0]);//列印陣列的首地址
	for (int i = 0; i < 5; i++) {//下標迴圈
		//列印陣列元素的值
		printf("%d,%d\n", a[i], *(a + i));//a是一個地址值,a+1表示地址值前進一個該型別大小的位元組
		//列印陣列元素的地址
		printf("%x,%x\n", &a[i], a + i);
	}
	for (int *p = a; p < a + 5; p++) {//指標迴圈
		printf("\n%d,%x", *p, p);
	}
	system("pause");
  1. 指標運算*a++遍歷陣列
#pragma warning(disable:4996)

# include <stdio.h>
# include <stdlib.h>
void main() {
	int a[5] = { 1,2,3,4,5 };
	for (int *p = a; p < a + 5; p++) {//*(p+1)和*p++意義不相同,前者沒有改變p的地址,而後者改變了p的地址
		printf("%d,%x\n", *p, p);
	}
	system("pause");
}

二維陣列

a[i][j]=*((a+i)+j)
&a[i][j]=
(a+i)+j
a[i]=*(a+i)
&a[i]=a+i

#pragma warning(disable:4996)

# include <stdio.h>
# include <stdlib.h>
void main() {
	int a[3][3] = { 1,2,3,4,5,6,7,8,9 };
	printf("%x, %d", &a, sizeof(*&a));//&a是整個陣列,長度4*3*3個位元組
	printf("%x, %d", a, sizeof(*a)); //a是行地址(二維陣列中,行是一個元素,一維陣列元素是一個元素),長度4*3位元組
	printf("%x, %d", *a, sizeof(**a)); //*a元素地址,長度4*1位元組,多重指標
	
	
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			printf("%d,%x ", a[i][j], &a[i][j]);
		}
		printf("\n");
	}
	printf("\n   %x    %x    %x", *a, *a + 1, *a + 2);//分別代表第0行的第一/二/三個元素,地址每次前進4*1個位元組
	printf("\n   %x    %x    %x", a, a + 1, a + 2);//分別代表第0行,第1行,第2行的地址,地址每次前進4*3個位元組

	system("pause");
}

指標陣列

#include <stdio.h>
int main(int argc, char *argv[])
{
	int a = 10;
	int b = 20;
	int c = 30;
	int* arr[] = { &a,&b,&c };
	//arr[0] == &a;
	*arr[0] = 100;
	printf("%d\t%d\t%d\t", a, b, c);
	system("pause");
	return 0;
}

參考:
https://www.cnblogs.com/downey-blog/p/10469906.html

相關文章