C語言 指標與陣列
基礎
- 陣列名=陣列首元素指標
- 用陣列名的解引用buf來訪問第一個元素,也可以使用(buf+N)來訪問第N個元素。
陣列指標(型別為元素,型別為整個陣列)和指標陣列
- 指向陣列的指標常被簡稱為陣列指標(array pointer),包含兩種情況一個是指向元素的首個元素地址,另一個是指向整個陣列,雖然二者地址值相同,但是指標型別不同.
- 而具有指標型別元素的陣列則被稱為指標陣列(pointer array)
- 主要應用是陣列指標的第一種,既指向陣列首元素的指標
#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
陣列指標(元素)
陣列變數名既是指標
- p=&a; //將變數地址賦值給指標
- p=array; //將陣列地址賦值給指標
- p=&array[i]; //將陣列元素賦值給指標
- 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++
- 指標運算*(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");
- 指標運算*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
相關文章
- C語言程式設計基礎:指標陣列與陣列指標C語言程式設計指標陣列
- C語言學習歷程(十二)陣列指標與指標陣列C語言陣列指標
- C語言雜談:指標與陣列 (上)C語言指標陣列
- C語言雜談:指標與陣列 (下)C語言指標陣列
- C語言雜談:指標與陣列(下)C語言指標陣列
- C語言指標(三):陣列指標和字串指標C語言指標陣列字串
- c語言-運算子,陣列,指標C語言陣列指標
- C語言指標和陣列基礎C語言指標陣列
- C語言指標和陣列筆試題C語言指標陣列筆試
- (C語言)使用指標列印陣列的內容C語言指標陣列
- C語言核心之陣列和指標詳解C語言陣列指標
- 指標陣列與陣列指標指標陣列
- C++ 指標陣列與陣列指標的區別C++指標陣列
- C語言系列之 指標與陣列總複習視訊教程C語言指標陣列
- 指標陣列和陣列指標與二維陣列指標陣列
- C語言_指標和陣列的幾種訪問形式C語言指標陣列
- C++語言中陣列指標和指標陣列徹底分析(系列一) (轉)C++陣列指標
- C++語言程式設計筆記 - 第6章 - 陣列、指標與字串C++程式設計筆記陣列指標字串
- c程式設計--指標與陣列C程式程式設計指標陣列
- C語言:陣列和指標的區別C語言陣列指標
- 陣列指標,指標陣列陣列指標
- 陣列指標 指標陣列陣列指標
- C語言 C語言野指標C語言指標
- C陣列和指標陣列指標
- C語言(指標)C語言指標
- C語言指標C語言指標
- 深入探索 C/C++ 陣列與指標的奧祕之一:陣列與指標概念剖析C++陣列指標
- 陣列指標和指標陣列陣列指標
- C語言使用指標對陣列指定位置進行插入元素C語言指標陣列
- 郝斌老師C語言學習筆記----指標和陣列C語言筆記指標陣列
- 補充內容:C++語言中陣列指標和指標陣列徹底分析 (轉)C++陣列指標
- C語言陣列C語言陣列
- C語言-指標操作C語言指標
- 徹底搞清C/C++中一維陣列,二維陣列,指標,陣列指標和指標陣列以及指向指標的指標,行地址和列地址之間的關係C++陣列指標
- C語言學習之:指標與字串C語言指標字串
- Go 陣列指標(指向陣列的指標)Go陣列指標
- 二維陣列與指標陣列指標
- c語言的陣列C語言陣列