#include<stdio.h>
void main()
{
int a[] = { 1, 2, 3, 4 };
int b[] = { 5, 6, 7 };
int *p[2];
p[0] = a;
p[1] = &b + 1;
printf("%d\n%d", &p[1][0], p[0][1]);
}
这里p
是一个指针数组,那么为什么在printf
语句中使用了一个二维数组。输出也是1 2
。
答案 0 :(得分:2)
这里p是一个指针的数组
是的,您可以使用下标运算符ptr[index]
,其指针等同于*(ptr + index)
因此p[1][0]
与*(p[1] + 0)
相同,与*(p[1])
此外,由于包括void main()
举例说明:
int main()
{
const char *hello = "hello";
const char *world = "world";
const char *array[2] = {hello, world};
char e = hello[1]; // char e now contains 'e'
e = array[0][1]; // same thing as previous line
char r = world[2]; // char r now contains 'r'
r = array[1][2]; // same thing as previous line
}
答案 1 :(得分:0)
下标运算符[]
是为指针表达式和数组表达式(在应用下标之前隐式转换为指针表达式)定义的。
表达式a[i]
被评估为*(a + i)
; a
是一个指针,a + i
给出数组的i
'元素的地址(指针算法基于指向类型;如果a
指向int
,则a + i
会在i
指向的int
之后提供a
'int *p[2];
的地址。
所以给出你的指针数组:
p[0]
表达式*(p[0] + 1)
具有指针类型,因此您可以添加偏移量并取消引用结果:p[0][1]
,这与写入{{1}}相同。