对指针概念的强化

指针是一种数据类型

间接赋值是指针存在的最大意义

int a = 10;
int *p = &a;
  • 指针也是一种变量,占有内存空间,用来保存内存地址
  • *p通过地址(p变量的值)找到一块内存,然后操作内存,*p在等号左边为赋值,在右边为取值
  • 指针变量和它指向的内存块是两个不同的概念,给p赋值只会改变指针变量的值(地址),不会影响所指的内容,给*p赋值会改变所指的内容,不会影响指针变量的值(地址)
  • 指针也是一种数据类型,例如int *p是指向了一个int类型的内存空间。指针的内存大小都是4个字节,而指针的步长是根据类型在内存中的占比大小来算的
int a = 0;//6422028
int *b = &a;
printf("%d\n", b);//6422028
b++;
printf("%d\n", b);//6422032

double *c = &a;
printf("%d\n", c);//6422028
c++;
printf("%d\n", c);//6422036

指针做函数参数

需要理解的是:主调函数还是被调函数分配内存,被调用函数是在堆上或栈上分配内存

 

一级指针的典型用法

做输入

int ShowBuf(char *p)
int ShowArray(int *array,int num)

做输出

int GetLen(char *pName,int *pLen)

二级指针的典型用法

做输入

int main(int arc ,char *arg[]); \\字符串数组
int ShouMatrix(int [3][4], int iLine);

做输出

int GetTeacher(Teacher **ppTeacher);
int GetTeacher_Free(Teacher **ppTeacher);
int getData(char **data, int *dataLen);
Int getData_Free(void *data);
Int getData_Free2(void **data); //避免野指针

三级指针的典型用法

做输出

int getFileAllLine(char ***content, int *pLine); 
int getFileAllLine_Free(char ***content, int *pLine);

野指针 2种free形式

int getData_Free(void *data)
{
    int ret = 0;
    concreteType *temp = NULL;
    if(data == NULL)
    {
        ret = -1;
        //TODO
        return ret;
    }
    temp = data;
    if(temp != NULL)
        free(temp);

    return ret;
}
int getData_Free(void **data)
{
    int ret = 0;
    concreteType *temp = NULL;
    if(data == NULL)
    {
        ret = -1;
        //TODO
        return ret;
    }
    temp = *data;
    if(temp != NULL)
    {
        free(temp);
        *date = NULL;
    }

    return ret;
}

对指针用法的补充:

  1. 指针指向谁就把谁的地址赋值给指针
  2. 指针对于链表来说是最适用的
  3. 在链表的学习中关键是分清链表操作和辅助指针变量之间的逻辑关系
  4. 对于JAVA语言来说其学习特点是学习、应用、上项目;而c/c++是学习、理解、应用、上项目
  5. 指针是c语言的半壁江山,而另外一半就是结构体

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值