【C语言】指针速览

简介: 【C语言】指针速览

指针

指针就是内存的字节单元编号地址,指针变量就是存放地址的变量。

1.野指针与空指针

  野指针是指,指针变量被赋值了一个随意的数值,这个数值并不是已知变量的内存地址,这个数值指向的区域未知,导致这个指针没有实际意义,如果对这个指针指向的内存区域进行操作还会导致错误。

  例如下面都是野指针:

int *p;
p=0x12345678;//给指针变量赋值了一个随意的数值
*p=20;        //对未知区域赋值,报错
//输出报错,段错误
Segmentation fault (core dumped)

int a=123;
p=a;    //给指针变量赋值了一个随意的数值

  空指针是指指针变量没有指向任何变量,该指针变量空闲可用。用代码表示就是 该指针变量指向NULL。NULL是一个值为0的宏常量。

#define NULL ((void *)0)
//空指针
int *p=NULL;

2. 空类型指针 void *

   void * 可以指向任何变量的内存空间,是一个万能指针。

//可以写成 void *p = NULL;  初始化

//案例
void *p;
int a=100;
char c='W';

p=NULL;
//p=(void *)&a;    
p=&a;
printf("%d\n",*(int *)p);    //输出100

//p=(void *)&c;
p=&c;
printf("%c\n",*(char *)p);    //输出W

3. 指针常量

意思是这个指针变量是一个常量,指向的地址不能改变,也就是指针变量的内容不能变,指向的值可以变;

int i = 9;
//指针常量
int *const p = &i;
//改变指向的值
*p = 3;

4. 常量指针

指针的指向可以变,指向的值不能变;

int i=9;
int j=10;
int const *p = &i;  //或者const int *p = &i;
printf("%d\n",*p);    //输出9
//*p=20; //修改指向的值,报错 
p=&j;    //修改指向 
printf("%d\n",*p);    //输出10

5. 指向常量的指针常量

既不能修改指向,又不能修改指向的值

int i = 9;
int const *const p = &i; //或者 const int const *p = &i;

6. 指针操作数组

数组名就是数组的地址。

int a[10]={
   1,2,3,4,5,6,7,8,9,0};
int len=sizeof(a)/sizeof(a[0]);
int i;
//方式一,使用i变量
for(i=0;i<len;i++)
{
   
    printf("%d,",*(a+i));
}
printf("\n");
//方式二,使用临时指针变量

int *p=a;
for(i=0;i<len;i++)
{
   
    printf("%d,",*p);
    p++;
}

//输出
1,2,3,4,5,6,7,8,9,0,
1,2,3,4,5,6,7,8,9,0,

6.1 数组名作为函数参数

void printArr(int *a,int len)
{
   
    int i;
    for(i=0;i<len;i++)
    {
   
        printf("%d,", a[i]);
        //printf("%d,", *(a+i));
    }
    printf("\n");
}

int main()
{
   
    int a[]={
   1,2,3,4,5};
    int len=sizeof(a)/sizeof(a[0]);
    printArr(a,len);
    return 0;
}

7. 多级指针

int m=10;        
int *n=&m;        //*n就是m
int **i=&n;        //*i就是n,**i就是m
int ***j=&i;    //*j就是i,**j就是n,***j就是m

printf("%d\n",*n);        //10
printf("%d\n",**i);        //10
printf("%d\n",***j);    //10

8. 函数指针

函数名就是函数的地址,说明函数也是存在内存中的,可以利用它的地址调用函数。

函数指针可以指向同类型的函数,要求参数类型,返回值一样。

函数指针就是一个指针,指向的是一个函数。

#include <stdio.h>

int sum(int a,int b);
int des(int a,int b);
int mul(int a,int b);

int main()
{
   
    //定义一个函数指针,指向的函数返回值是int,参数是 int,int 
    int(* pfun)(int a,int b)=NULL;

    //赋值
    //直接使用  pfun=sum; 也可以
    pfun=&sum;
    printf("%d\n",pfun(1,2));        //3

    pfun=&mul;
    printf("%d\n",pfun(4,2));        //8

    pfun=&des;
    printf("%d\n",pfun(5,3));        //2

    return 0;
}

int sum(int a,int b)
{
   
    return a+b;
}

int des(int a,int b)
{
   
    return a-b;
}

int mul(int a,int b)
{
   
    return a*b;
}

8.1 函数指针数组

#include <stdio.h>

int sum(int a,int b);
int des(int a,int b);
int mul(int a,int b);

int main()
{
   
    //定义一个函数指针,指向的函数返回值是int,参数是 int,int 
    int(* pfun[3])(int a,int b)={
   sum,des,mul};
    int i;
    for(i=0;i<3;i++)
    {
   
        printf("%d\n",pfun[i](10,5));
    }

    return 0;
}

int sum(int a,int b)
{
   
    return a+b;
}

int des(int a,int b)
{
   
    return a-b;
}

int mul(int a,int b)
{
   
    return a*b;
}

//输出
15
5
50
目录
相关文章
|
1月前
|
存储 C语言
【C语言篇】深入理解指针3(附转移表源码)
【C语言篇】深入理解指针3(附转移表源码)
36 1
|
27天前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
45 0
|
26天前
|
C语言
【c语言】指针就该这么学(3)
本文介绍了C语言中的函数指针、typedef关键字及函数指针数组的概念与应用。首先讲解了函数指针的创建与使用,接着通过typedef简化复杂类型定义,最后探讨了函数指针数组及其在转移表中的应用,通过实例展示了如何利用这些特性实现更简洁高效的代码。
15 2
|
27天前
|
C语言
如何避免 C 语言中的野指针问题?
在C语言中,野指针是指向未知内存地址的指针,可能引发程序崩溃或数据损坏。避免野指针的方法包括:初始化指针为NULL、使用完毕后将指针置为NULL、检查指针是否为空以及合理管理动态分配的内存。
|
27天前
|
C语言
C语言:哪些情况下会出现野指针
C语言中,野指针是指指向未知地址的指针,通常由以下情况产生:1) 指针被声明但未初始化;2) 指针指向的内存已被释放或重新分配;3) 指针指向局部变量,而该变量已超出作用域。使用野指针可能导致程序崩溃或不可预测的行为。
|
1月前
|
存储 C语言
C语言32位或64位平台下指针的大小
在32位平台上,C语言中指针的大小通常为4字节;而在64位平台上,指针的大小通常为8字节。这反映了不同平台对内存地址空间的不同处理方式。
|
1月前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
1月前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
1月前
|
C语言
C语言指针(3)
C语言指针(3)
12 1
|
1月前
|
C语言
C语言指针(2)
C语言指针(2)
14 1