指针的用法及说明

1、一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数

int (*p[10])(int);

首先,定义一个函数,这个函数有一个整参数,并返回一个整型数:int fun(int);

然后,定义一个有10个指针的整型数组:int *p[10];

最后,使指针数组替换函数名,即得到想要的结果:int (*p[10])(int);


2、指针数组和数组的指针:点击打开链接(引用)

指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。

下面到底哪个是数组指针,哪个是指针数组呢:
A)
int *p1[10];
B)
int (*p2)[10];
这里需要明白一个符号之间的优先级问题。
“[]”的优先级比“*”要高。p1 先与“[]”结合,构成一个数组的定义,数组名为p1,int *修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含10 个指向int 类型数据的指针,即指针数组。至于p2 就更好理解了,在这里“()”的优先级比“[]”高,“*”号和p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针。我们可以借助下面的图加深理解:





3、以下代码涉及到三点东西:

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdbool.h>

#define max(a, b) a >b ? a : b;

bool get(char **buf)
{
        if((*buf = (char *)malloc(20)) == NULL)
                return false;
        strcpy(*buf, "zhaozhanwei");
        printf("the buf is %s\n", *buf);

        return true;
}

void get1(int *a)
{
        *a = 10;
}

void main(int argc, char **argv)
{
    int a;
    bool b;
    char *buff = NULL;

    printf("the input is %d : %s\n", argc, argv[0]);
    a = max(2, 3);
    printf("a is %d\n", a);

    //memset(buff, 0, 20);
    b = get(&buff);

    if(b == true)
        printf("the buff is %s\n", buff);
    else
        printf("error\n");

   get1(&a);
   printf("a is %d\n", a);

}
第一点:通过实现宏定义实现比较大小,返回较大的值,其中用到了三元运算符 “?:”。

第二点:指针传值,包括int型和cha型的指针,如果想要利用参数从调用函数中取数据或者申请空间,需要用到指针的指针,否则参数的值可以传过去,但是经过修改后的值无法取回来。

第三点:对malloc函 数进行封装,申请内存,申请成功返回true,失败返回false,同时,还要注意申请的变量空间能够传回来以供使用


4、char **p,a[6][8]; 问p=a是否会导致程序在以后出现问题?为什么? 点击打开参考链接
直接用程序说明:
void main()
{
    char **p,a[6][8];
    p = a;
    printf("\n");
}
编译,然后就会发现通不过,报错:错误 1 error C2440: “=”: 无法从“char [6][8]”转换为“char **” 

在《C专家编程》10.3节的小启发里讲的很透彻:(以下这段文字及对比一定要认真分析!)

数组和指针参数是如何被编译器修改的?

数组名被改写成一个指针参数”规则并不是递归定义的。数组的数组会被改写成“数组的指针”,而不是“指针的指针”:

实参                                                      所匹配的形参

数组的数组          char c[8][10];                 char (*)[10];          数组指针

指针数组             char *c[10];                   char **c;               指针的指针

数组指针(行指针)  char (*c)[10];                 char (*c)[10];        不改变

指针的指针           char **c;                       char **c;               不改变





猜你喜欢

转载自blog.csdn.net/zhanweizhao_111/article/details/38318371