学习C – C数组指针
数组和指针
数组是同一类型的值的集合。
指针是可以引用另一个的变量(存储器地址)变量。
你可以使用指针来保存不同的地址变量,只要它们“全部是相同的类型。
没有索引值的数组名称指的是数组中第一个元素的地址。
您可以更改指针中包含的地址,但是你不能改变数组名引用的地址。
下面的代码显示一个数组名称本身指的是一个地址。
#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]
产生与表达式multiple相同的值。
上面的代码生成以下结果。
例2
因为多个计算结果的第一个字节的地址数组和& multiple [0]求值到数组的第一个元素的第一个字节。
此程序演示向指针添加整数值的效果。
#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;
}
上面的代码生成以下结果。
例3
向p中的地址添加整数n的计算结果与 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;
}
上面的代码生成以下结果。
例4
请注意,您可以在此示例中直接使用数组名称。 你可以写for循环:
#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得到的地址 数组中的下一个元素,这是在内存中的4个字节。
数组名称指的是固定地址,不是指针。
您可以使用数组名称作为表达式中的指针,但不能修改它。
上面的代码生成以下结果。
多维数组和指针
下面的代码就在这里探索与指针相关的多维数组。
#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;
}
下面的代码就在这里探索与指针相关的多维数组。…
所以当你使用数组名访问二维数组时使用a单个索引值my_array [0],你“引用其中一个子数组的地址。
总结表达式:
my_array my_array[0] &my_array[0][0]
这些都具有相同的值:my_array是二维数组的地址的炭元素, my_array [0]
是一个char元素的一维数组的地址,它是一个子数组 my_array
,& my_array [0] [0]
是char类型的数组元素的地址。
上面的代码生成以下结果。
例5
以下代码显示如何在二维数组中获取值。
#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;
}
上面的代码生成以下结果。
例6
你可以在这里看到多维数组和点:
#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;
}
上面的代码生成以下结果。