C语言指针知识点总结

指针

什么是指针?

指针就是一个地址,通过地址进而间接获得值。

组成:数据类型 *指针变量;==》 int *p;(当前指针的类型为:int型)。

记住一句话,指针永远指向地址,如果不指向地址,那么就是错误的。

那在C语言程序当中怎么实现间接取值呢?

例:

include <stdio.h>
int main()
{
    int data=10;//定义一个整型变量data,值为10
    int *p;//定义一个指针变量p
    p=&data;//把data地址赋值给p
    printf("打印输出*p:%d",*p);//指针p就可以间接取到data的值10
    return 0;
}

地址

什么是地址?

地址就是存储的位置信息,地址是不变的,但是地址上的变量是可变的。

野指针

什么是野指针?

野指针就是:当前指针的指向的地址是随机的、不可知的。

野指针成因:

1.指针没有初始化。

当我们定义一个指针变量的时候没有让它指向任何对象。

#include <stdio.h>
int main()
{
    int *p;
    *p=10;
    printf("%p",*p);//打印为:000000000000000A
    return 0;
}
2.指针越界
#include <stdio.h>
int main()
{
    int arr[3]={11,22,33};
    int *p=arr;
    int i;
    for(i=0;i<4;i++)
    {
        printf("%d\n",*p++);
    } 
    return 0;
}

打印结果:

明显可以看出,数组arr只有3个元素,但是for循环却执行4次,导致指针越界生成一个随机数3。

如何避免野指针?
  1. 善于使用NULL,及时对指针进行初始化。NULL是空的意思

int *p=NULL;//此时p就是一个空指针,后面可重新赋值,不影响使用。

  1. 避免指针的越界。清楚指针的指向范围,防止越界

指针数组

指针数组的定义:数据类型 *指针变量名[元素的个数]。

int * p[5];

本质上就是一个数组,只不过它是由多个指针变量构成的。指针变量存放各自指向的地址。

定义3个指针存入指针数组m,它们各自指向的地址为abc、def、g。(地址随便取的)

#include <stdio.h>
int main()
{
    char *p="abc";
    char *q="def";
    char *t="g";
    char *m[]={p,q,t,NULL};
    for(int i=0;m[i]!=NULL;i++)
    {  printf("%s\n",m[i]); 

    }
    return 0;
}

循环输出结果为:

数组指针

数组指针定义:数据类型(*指针变量名)【元素的个数】

int (*p)[5];

本质上它就是一个指针,它是存在于二维以及多位数组中的行指针。

指针函数

指针函数的定义: 数据类型 * 指针变量(参数)

int * p();

可以返回指针值的函数。

函数指针

函数指针的定义: 数据类型 * 指针变量(参数)

int (*p)();

指向函数的指针。

多级指针

定义:1.一级指针保存的是变量的地址。2.二级指针保存一级指针的地址。 3.三级指针保存的二级指针的地址。
#include <stdio.h>
int main()
{
    int data=10;
    int*a=&data; 
    int **b=&a; 
    int***c=&b;
    return 0;
}

上述为一级指针、二级指针和三级指针,如此类推。。。

指针和数组

指针和数组的区别

数组和指针不是一个东西。

数组能够存放一组数,连续的空间,数组的大小取决于元素个数。

指针是一个变量,是存放地址的。

#include <stdio.h>
int main()
{
    int arr[4] = { 11,22,33,44 };
    int* p = arr;
    int i = 0;
    int len = sizeof(arr) / sizeof(arr[0]);
    for (i = 0; i < len; i++)
    {
        printf("%d ", *(p + i));
    }
    return 0;
}

输出结果:

二维数组

关于二维数组a的有关指针和地址取值如下图一、二所示。

int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};

(图一)

(图二)

总结

以上为本人浅薄见解,作为学习记录,希望对你有所帮助,让我们一起变得更强!

哈哈哈哈哈,加油哦!下期再会。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值