本文概述
- C双指针示例
- 问:以下程序的输出是什么?
文章图片
下面给出了声明双指针的语法。
int **p;
// pointer to a pointer which is pointing to an integer.
考虑以下示例。
#include<
stdio.h>
void main ()
{
int a = 10;
int *p;
int **pp;
p = &a;
// pointer p is pointing to the address of a
pp = &p;
// pointer pp is a double pointer pointing to the address of pointer p
printf("address of a: %x\n", p);
// Address of a will be printed
printf("address of p: %x\n", pp);
// Address of p will be printed
printf("value stored at p: %d\n", *p);
// value stoted at the address contained by p i.e. 10 will be printed
printf("value stored at pp: %d\n", **pp);
// value stored at the address contained by the pointer stoyred at pp
}
输出量
address of a: d26a8734
address of p: d26a8738
value stored at p: 10
value stored at pp: 10
C双指针示例让我们看一个例子,其中一个指针指向另一个指针的地址。
文章图片
如上图所示,p2包含p的地址(fff2),p包含数字变量的地址(fff4)。
#include<
stdio.h>
int main(){
int number=50;
int *p;
//pointer to int
int **p2;
//pointer to pointer
p=&number;
//stores the address of number variable
p2=&p;
printf("Address of number variable is %x \n", &
number);
printf("Address of p variable is %x \n", p);
printf("Value of *p variable is %d \n", *p);
printf("Address of p2 variable is %x \n", p2);
printf("Value of **p2 variable is %d \n", *p);
return 0;
}
输出量
Address of number variable is fff4
Address of p variable is fff4
Value of *p variable is 50
Address of p2 variable is fff2
Value of **p variable is 50
问:以下程序的输出是什么?
#include<
stdio.h>
void main ()
{
int a[10] = {100, 206, 300, 409, 509, 601};
//Line 1
int *p[] = {a, a+1, a+2, a+3, a+4, a+5};
//Line 2
int **pp = p;
//Line 3
pp++;
// Line 4
printf("%d %d %d\n", pp-p, *pp - a, **pp);
// Line 5
*pp++;
// Line 6
printf("%d %d %d\n", pp-p, *pp - a, **pp);
// Line 7
++*pp;
// Line 8
printf("%d %d %d\n", pp-p, *pp - a, **pp);
// Line 9
++**pp;
// Line 10
printf("%d %d %d\n", pp-p, *pp - a, **pp);
// Line 11
}
说明
文章图片
在上述问题中,指针算术与双指针一起使用。定义了一个由6个元素组成的数组,该数组由指针p的数组指向。指针数组p由双指针pp指向。但是,上图为你简要介绍了如何将内存分配给数组a和指针数组p。 p的元素是指向数组a的每个元素的指针。由于我们知道数组名称包含数组的基地址,因此它将用作指针,并且可以使用*(a),*(a 1)等来遍历该值。如图所示,可以通过以下方式访问a [0]。
- a [0]:这是访问数组第一个元素的最简单方法
- *(a):由于存储了数组第一个元素的地址,因此我们可以通过使用间接指针来访问其值。
- * p [0]:如果要使用指向其的指针p访问a [0],则可以在指针数组p的第一个元素上使用间接运算符(*),即* p [0]。
- **(pp):因为pp存储指针数组的基地址,所以* pp将给出指针数组的第一个元素的值,即整数数组的第一个元素的地址。 ** p将给出整数数组第一个元素的实际值。
第5行包含一个可打印三个值的表达式,即pp-p,* pp-a和** pp。让我们计算它们中的每一个。
- pp = 302,p = 300 => pp-p =(302-300)/ 2 => pp-p = 1,即将打印1。
- pp = 302,* pp = 202,a = 200 => * pp-a = 202-200 = 2/2 = 1,即将打印1。
- pp = 302,* pp = 202,*(* pp)= 206,即206将被打印。
在第7行上,再次写入了表达式,该表达式输出三个值,即pp-p,* pp-a,* pp。让我们计算其中的每一个。
- pp = 304,p = 300 => pp-p =(304-300)/ 2 => pp-p = 2,即打印2。
- pp = 304,* pp = 204,a = 200 => * pp-a =(204-200)/ 2 = 2,即打印2。
- pp = 304,* pp = 204,*(* pp)= 300,即300。
在第9行上,再次写入了表达式,该表达式输出三个值,即pp-p,* pp-a,* pp。让我们计算其中的每一个。
- pp = 304,p = 300 => pp-p =(304-300)/ 2 => pp-p = 2,即打印2。
- pp = 304,* pp = 206,a = 200 => * pp-a =(206-200)/ 2 = 3,即3。
- pp = 304,* pp = 206,*(* pp)= 409,即会打印409。
在第11行上,再次写入了表达式,该表达式打印三个值,即pp-p,* pp-a,* pp。让我们计算其中的每一个。
- pp = 304,p = 300 => pp-p =(304-300)/ 2 => pp-p = 2,即打印2。
- pp = 304,* pp = 206,a = 200 => * pp-a =(206-200)/ 2 = 3,即3。
- 在第8行上,** pp = 410。
最后,完整程序的输出将给出为:
输出量
1 1 206
2 2 300
2 3 409
2 3 410