簡體   English   中英

在C語言中將指針與Array一起使用

[英]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]都為您提供相同的地址,但它們的類型卻不同。 n2D 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);
}

最初, ptr1ptr2都將打印相同的地址。 但是,在遞增之后, ptr1ptr2將指向不同的地址,因為它們的類型不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM