C和指针 第13章 高级指针话题 13.9 问题

本文详细解析了C语言中的高级指针声明,包括函数返回值为指针、指针的指针等复杂声明,并通过实例展示了指针变量的递增操作效果。此外,讨论了多层指针参数的使用方法和访问底层值的表达式。最后,文章通过代码示例分析了指针操作中的常见问题和优化技巧,如指针数组、指针的指针数组以及如何避免内存溢出。
摘要由CSDN通过智能技术生成

1. 下面显示了一列声明。
解析: 
a. int abc();                   VIII. 返回值为int的函数。 
b. int abc[3];                    III. int型数组。 
c. int **abc();                    X. 返回值为“int型指针的指针”的函数。 
d. int (*abc)();                   XI. 返回值为int的函数指针。 
e. int (*abc)[6];                 IV. 指向“int型数组”的指针。 
f. int *abc();                      IX. 返回值为“int型指针”的函数。 
g. int **(*abc[6])();          XVI. 指向“返回值为int型指针的指针的函数”的指针的数组。 
h. int **abc[6];                  VII. int型指针的指针的数组。 
i. int *(*abc)[6];                  VI. 指向“int型指针数组”的指针。        
j. int *(*abc())();               XIX. 返回值为“返回值为int型指针的函数指针”的函数。 
k. int (**(*abc)())();          XXI. 返回值为“返回值为int的函数指针的指针”的函数指针。 
l. int (*(*abc)())[6];         XXIII. 返回值为“指向int型数组的指针”的函数指针。 
m. int *(*(*(*abc)())[6])();XXV. 返回值为“指向‘返回值为int型指针的函数指针’的数组的指针”的函数指针。 
2. 给定下列声明:
    char *array[10];
    char **ptr = array;
如果变量加上1, 它的效果是什么样的? 
解析: 
#include <stdio.h>
#include <stdlib.h>

int main( void ){
    char *array[10];
    char **ptr = array;
    
    printf( "ptr = %p, ptr + 1 = %p, array + 1 = %p\n", ptr, ptr + 1, array + 1 );
    
    return EXIT_SUCCESS;
}
输出:

3. 假定要编写一个函数,它的起始部分如下所示:
    void func( int ***arg );
参数的类型是什么?画一张图,显示这个变量的正确用法。如果想取得这个参数所指代的整数,应该使用怎样的表达式? 
解析:
参数的类型是一个指针,该指针又指向另外一个指针,另外一个指针还指向另外一个指针。
如果想取得这个参数所指代的整数,应该使用***arg形式来获取值。图我就不画了,只需要明白指针里面存放的是变量的地址应该就能明白,在这里我用代码显示出来。
#include <stdio.h>
#include <stdlib.h>

void func( int ***arg );

int main( void ){
    int value;
    int *pi;
    int **ppi;
    int ***pppi;
    
    value = 20; 
    pi = &value;
    ppi = &pi;
    pppi = &ppi;
    printf( "pppi = %p, &ppi = %p\nppi = %p, &pi = %p\npi = %p, &value = %p\n", pppi, &ppi, ppi, &pi, pi, &value );
    printf( "***pppi = %d, **ppi = %d, *pi = %d, value = %d\n", ***pppi, **ppi, *pi, value );
    func( pppi );
    printf( "In main function, value = %d\n", value );
    
    return EXIT_SUCCESS;
}

void func( int ***arg ){
    int value = ***arg;
    printf( "In func function, value = %d\n", value ); 
}
输出:

4. 下面的代码可以如何进行改进?
    Transaction *trans;
    trans->product->orders += 1;
    trans->product->quantity_on_hard -= trans->quantity;
    trans->product->suppiler->reorder_quantity += trans->quan

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值