[英]Using pointers with Array in C
以下程序的輸出是什么?
int main(void) {
int n[3][3] = {
2, 4, 3,
6, 8, 5,
3, 5, 1
};
int i, *ptr;
ptr = n;
for (i = 0; i <= 8; i++)
printf("\n%d", *(ptr + i));
}
在這里, n
對二維數組意味着什么? 還有什么ptr? 使用數組指針時,我感到很困惑。
每次輸出為4。 我想了解為什么每次都打印4個?
任何解釋都會對我有很大幫助。
ptr是“指向” n矩陣的第一個元素的指針。 您可以做到:
ptr = n[0];
您不能:
ptr = n;
因為'n'是“數組”的“數組”(第一個數組存儲2、4和3,第二個數組存儲6、8和5,依此類推...)
當您聲明“ n”個二維數組時,這些元素按線性順序存儲在內存中(一個整數分配接一個整數分配),這就是為什么可以使“ n”指向一個元素(在這種情況下為第一個元素)的原因),然后使其指向下一個元素(通過在指針上加1,這稱為“指針算術”)。
這是使程序以正確的方式工作的微小修正:
#include <stdio.h>
int main(void) {
int n[3][3] = {
2, 4, 3,
6, 8, 5,
3, 5, 1
};
int i, *ptr;
ptr = n[0];
for (i = 0; i <= 8; i++)
printf("\n%d", *(ptr + i));
}
輸出將是:
2 4 3 6 8 5 3 5
輸出:
2 4 3 6 8 5 3 5 1
按順序打印所有元素。 數組是連續的,ptr = n; n的分配地址;
n給出第一行的地址或第一元素的地址。
printf("%d %d %d",n,&n[0],&n[0][0]);
給出相同的地址。
arr [i]與*(arr + i)相同
n
n[0] or(n+0)
&n[0][0]
|
|
v
2 4 3 6 8 5 3 5 1
| | | |
|[0][0] | | |
|--row 0-------| row 1 |----row 2----|
每次執行ptr + i時,其執行指針運算都會將sizeof(int)添加到ptr結果中的內存中的下一個元素中。
ptr=n;
將2D array n
的起始地址分配給指針變量ptr
。 為了避免警告,分配ptr = &n[0][0];
。 即使n和&n [0] [0]都為您提供相同的地址,但它們的類型卻不同。 n
是2D array n
的起始地址, &n[0][0]
是數組的第一個元素n[0][0]
。
以下經過修改的程序將告訴您不同之處,
int main()
{
int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1};
int i, *ptr1, (*ptr2)[3];
ptr1 = &n[0][0];
ptr2=n;
printf("\n%p",ptr1);
printf("\n%p",ptr2);
printf("\n%p",++ptr1);
printf("\n%p",++ptr2);
}
最初, ptr1
和ptr2
都將打印相同的地址。 但是,在遞增之后, ptr1
和ptr2
將指向不同的地址,因為它們的類型不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.