我想要打印时打印3.我不明白我只增加一次的原因。如果这是正确使用指针t指针还让我知道?我刚刚制作了一个示例代码,以了解指针的指针是如何工作的。
#include<stdio.h>
void main(){
int a1[] = {1,2,3,4,5,6};
int a2[] = {7,8,9,10,11,12};
int *a3 = a1;
int *a4 = a2;
int **a[2];
a[0] = a3;
a[1] = a4;
printf("%d",*(++(*a)));
}
答案 0 :(得分:6)
您将a声明为int**
的数组,因此*a
不是指向int的指针,而是指向int的指针。增加指针会增加它指向的数据类型的大小,因此++*a
会使a[0]
处的值增加指针的大小。
实际存储在a[0]
中的是指向int的指针,而不是指向int的指针。这是错误的,编译器应该已经警告过你。在您的体系结构上,似乎指针的大小是int的两倍,因此增量++*a
将两个整数的大小添加到指针,因此a [0]处的值(如果解释为{{1})而不是int*
,跳过2。
要获得结果,您希望将其声明为int **
的数组。
int *
答案 1 :(得分:2)
*a
= *(a + 0)
= a[0]
包含地址= a3
,int*
(在您的代码a[0] = a3;
中)。
a3
指向a1
的第一个元素(在您的代码int *a3 = a1;
中,即一个)因此*a
指向{{1}的第一个元素}。
通过执行a1
,您指向++(*a)
中位于索引a1
的下一个元素,并在1
处使用*
在++(*a)
数组中打印1
索引值,输出:a1
那是2
所以,a1[1]
实际上是*(++(*a))
。
您打印代码打印a1[1]
而不是2
,请在codepade
答案 2 :(得分:2)
a[0] = &a3;
a[1] = &a4;
printf("%d",*(++(**a)));
根据定义,a应该包含指向int指针的指针。所以需要添加&amp;在a3和a4前面。在printf中,为了相同的原因,在递增之前需要使用去引用两次。
答案 3 :(得分:2)
您显然正在使用具有64位指针和32位整数的编译器。因为你已经错误地声明了a
,所以当你递增*a
时,你的指针大小增加 - 64位,即8位 - 而不是int的大小 - 32位,这是4个字节 - 所以有效地增加两个整数的大小。
将a
的声明更改为
int* a[2];
并且您的程序将正常运行。另外,使用-Wall(至少)编译以获得警告。
答案 4 :(得分:0)
您正在递增指针本身并再次打印它..
所以,
printf("%d",*(++(*a)));//would print 2
printf("%d",*(++(*a)));//would print 3
您应该使用*((*a)+1)
答案 5 :(得分:0)
#include<stdio.h>
int main(void)
{
int a1[] = {1,2,3,4,5,6};
int a2[] = {7,8,9,10,11,12};
int *a3 = a1;
int *a4 = a2;
int **a[2];
a[0] = &a3; // a3 is a pointer, so take its address to get a pointer to pointer
a[1] = &a4; // same here
printf("%d",*(*(a[0])+1)); // PRINTS 2
printf("%d",*(*(a[1])+1)); // PRINTS 8
return 0;
}