C语言教程
C语言控制语句
C语言函数
C语言数组
C语言指针
C语言字符串
C语言数学函数
C语言结构
C语言文件处理
C预处理器

C双指针(指针到指针)

我们知道,指针用于在C中存储变量的地址。指针减少了变量的访问时间。但是,在C语言中,我们也可以定义一个指针来存储另一个指针的地址。这种指针称为双指针(指向指针的指针)。第一个指针用于存储变量的地址,而第二个指针用于存储第一个指针的地址。让我们通过下面的图表来理解它。
指向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双指针示例

让我们看一个示例,其中一个指针指向另一个指针的地址。
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

Q。以下程序的输出是什么?

#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将给出整数数组第一个元素的实际值。
进入程序,第1行和第2行相对地声明了整数和指针数组。第3行初始化指向指针数组p的双指针。如图中所示,如果数组的地址从200开始且整数的大小为2,则指针数组将包含值200、202、204、206、208、210、让我们考虑指针数组的基地址为300;双指针pp包含指针数组的地址,即300。第4行将pp的值增加1,即pp现在将指向地址302、
第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、
因此,作为第5行的结果,输出1、1、206将被打印在控制台上。在第6行上,编写了* pp ++。在这里,我们必须注意,两个一元运算符*和++将具有相同的优先级。因此,根据关联性规则,将从右到左对其进行评估。因此,表达式* pp ++可以重写为(*(pp ++))。由于pp = 302,现在变为304、* pp将得到204、
在第7行,再次编写了表达式,该表达式打印三个值,即pp-p,* pp-a, *页让我们计算其中的每一个。
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。
因此,作为第7行的结果,输出2、2、300将打印在控制台上。在第8行上,编写了++ * pp。根据关联性规则,可以将其重写为(++(*(pp)))。由于pp = 304,* pp = 204,因此* pp = *(p [2])= 206的值现在将指向a [3]。
在第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、
因此,作为第9行的结果,输出2、3、409将打印在控制台上。在第10行,写入++ ** pp。根据关联性规则,可以将其重写为(++(*(*(pp()))))。 pp = 304,* pp = 206,** pp = 409,++ ** pp => * pp = * pp + 1 =410、换句话说,a [3] = 410、
在第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、
因此,作为第9行的结果,输出2、3、410将打印在控制台上。
最后,完整程序的输出将给出为:
输出
1 1 206
2 2 300
2 3 409
2 3 410 
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4