數(shù)組是同一類型的值的集合。
指針是可以引用另一個的變量(存儲器地址)變量。
你可以使用指針來保存不同的地址變量,只要它們“全部是相同的類型。
沒有索引值的數(shù)組名稱指的是數(shù)組中第一個元素的地址。
您可以更改指針中包含的地址,但是你不能改變數(shù)組名引用的地址。
下面的代碼顯示一個數(shù)組名稱本身指的是一個地址。
#include <stdio.h>
int main(void)
{
char multiple[] = "My string";
char *p = &multiple[0];
printf("The address of the first array element : %p\n", p);
p = multiple;
printf("The address obtained from the array name: %p\n", multiple);
return 0;
}
從輸出我們知道表達式& multiple [0]
產(chǎn)生與表達式multiple相同的值。
上面的代碼生成以下結(jié)果。
因為多個計算結(jié)果的第一個字節(jié)的地址數(shù)組和& multiple [0]求值到數(shù)組的第一個元素的第一個字節(jié)。
此程序演示向指針添加整數(shù)值的效果。
#include <stdio.h>
#include <string.h>
int main(void)
{
char multiple[] = "a string";
char *p = multiple;
for(int i = 0 ; i < strnlen(multiple, sizeof(multiple)) ; ++i) {
printf("multiple[%d] = %c *(p+%d) = %c &multiple[%d] = %p p+%d = %p\n", i, multiple[i], i, *(p+i), i, &multiple[i], i, p+i);
}
return 0;
}
上面的代碼生成以下結(jié)果。
向p中的地址添加整數(shù)n的計算結(jié)果與 multiple [n]
相同。
#include <stdio.h>
int main(void)
{
long multiple[] = {15L, 25L, 35L, 45L};
long *p = multiple;
for(int i = 0 ; i < sizeof(multiple)/sizeof(multiple[0]) ; ++i) {
printf("address p+%d (&multiple[%d]): %llu *(p+%d) value: %d\n", i, i, (unsigned long long)(p+i), i, *(p+i));
}
printf("\n Type long occupies: %d bytes\n", (int)sizeof(long));
return 0;
}
上面的代碼生成以下結(jié)果。
請注意,您可以在此示例中直接使用數(shù)組名稱。 你可以寫for循環(huán):
#include <stdio.h>
int main(void)
{
long multiple[] = {15L, 25L, 35L, 45L};
long *p = multiple;
for(int i = 0 ; i < sizeof(multiple)/sizeof(multiple[0]) ; ++i)
printf("address p+%d (&multiple[%d]): %llu *(p+%d) value: %d\n",
i, i, (unsigned long long)(multiple+i), i, *(multiple+i));
return 0;
}
表達式multiple和multiple + i都計算一個地址。
將乘以1乘以1得到的地址 數(shù)組中的下一個元素,這是在內(nèi)存中的4個字節(jié)。
數(shù)組名稱指的是固定地址,不是指針。
您可以使用數(shù)組名稱作為表達式中的指針,但不能修改它。
上面的代碼生成以下結(jié)果。
下面的代碼就在這里探索與指針相關(guān)的多維數(shù)組。
#include <stdio.h>
int main(void)
{
char my_array[3][3] = {
{"1","2","3"},
{"4","5","6"},
{"7","8","9"}
};
printf("address of my_array : %p\n", my_array);
printf("address of my_array[0][0] : %p\n", &my_array[0][0]);
printf("value of my_array[0] : %p\n", my_array[0]);
return 0;
}
下面的代碼就在這里探索與指針相關(guān)的多維數(shù)組。...
所以當你使用數(shù)組名訪問二維數(shù)組時使用a單個索引值my_array [0],你“引用其中一個子數(shù)組的地址。
總結(jié)表達式:
my_array my_array[0] &my_array[0][0]
這些都具有相同的值:my_array是二維數(shù)組的地址的炭元素, my_array [0]
是一個char元素的一維數(shù)組的地址,它是一個子數(shù)組 my_array
,& my_array [0] [0]
是char類型的數(shù)組元素的地址。
上面的代碼生成以下結(jié)果。
以下代碼顯示如何在二維數(shù)組中獲取值。
#include <stdio.h>
int main(void)
{
char my_array[3][3] = {
{"1","2","3"},
{"4","5","6"},
{"7","8","9"}
};
// List all elements of the array
for(int i = 0 ; i < 9 ; ++i)
printf(" my_array: %c\n", *(*my_array + i));
return 0;
}
上面的代碼生成以下結(jié)果。
你可以在這里看到多維數(shù)組和點:
#include <stdio.h>
int main(void)
{
char my_array[3][3] = {
{"1","2","3"},
{"4","5","6"},
{"7","8","9"}
};
char *pmy_array = *my_array; // A pointer to char
for(int i = 0 ; i < 9 ; ++i)
printf(" my_array: %c\n", *(pmy_array + i));
return 0;
}
上面的代碼生成以下結(jié)果。
更多建議: