C语言-一维指针定义与使用

简介: 指针作为C语言的灵魂,项目里指针无处不在。这篇文章就介绍C语言指针的基本使用。

1. 前言

指针在很多书本上都是当做重点来介绍,作为C语言的灵魂,项目里指针无处不在。

比如: 指针作为函数形参的时候,可以间接修改源地址里的数据,也就相当于解决了函数return一次只能返回一个值的问题。

指针在嵌入式、单片机里使用最直观,可以直接通过指针访问寄存器地址,对寄存器进行配置;计算机的CPU、外设硬件都是依靠地址操作的。

2. 指针变量如何定义?

#include <stdio.h>
#include <string.h>
int main()
{
    char *p1;  //定义一个char类型的指针变量
    int *p2;   //定义一个int类型的指针变量
    //int类型的指针变量: 存放地址数据。
    
    int data=123; //定义一个int类型的变量
    //int类型的变量: 存储整数数据。
    return 0;
}

3. 指针如何使用?

#include <stdio.h>
#include <string.h>
int main()
{
    // &data  取地址    a&b 按位与   a&&b  并且
    // int *p 定义一个int类型的指针
    // *p  取出指针指向空间中的数据--取数据
    // a*b a和b乘法
    
    int *p; //指针变量本身就是存放地址的
    int data=123; 
    //p=data; //错误:data本身只是一个变量标识符,不是地址
    p=&data;  //将data的地址赋值给指针p
    
    printf("*p=%d\n",*p); //取出指针p指向空间中的数据
    *p=666; //给指针指向的空间赋值
    printf("data=%d\n",data);
    return 0;
}

4. 什么是野指针?

野指针就是本身没有合法地址空间---非法指针。

野指针会导致的常见错误:段错误。

下面代码就会导致段错误:

#include <stdio.h>
#include <string.h>
int main()
{
    int *p;//指针只能存放地址
    *p=123;
    printf("*p=%d\n",*p);
    return 0;
}

5. 指针本身占的空间是多少?

所有指针类型都占4个字节空间。和类型没有关系。

#include <stdio.h>
#include <string.h>
int main()
{
    int *int_p;//指针只能存放地址
    int int_a;
    char *char_p;//指针只能存放地址
    char char_a;
    float *float_p;//指针只能存放地址
    float float_a;
    double *double_p;//指针只能存放地址
    double double_a;
    printf("int_a=%d\n",sizeof(int_a));//4
    printf("int_p=%d\n",sizeof(int_p));//4
    
    printf("char_a=%d\n",sizeof(char_a));
    printf("char_p=%d\n",sizeof(char_p));
    
    printf("float_a=%d\n",sizeof(float_a));
    printf("float_p=%d\n",sizeof(float_p));
    
    printf("double_a=%d\n",sizeof(double_a));
    printf("double_p=%d\n",sizeof(double_p));
    return 0;
}

6. 指针访问数组成员

6.1 访问一维数组成员的方式有哪些?

#include <stdio.h>
#include <string.h>
int main()
{
    int a[]={1,2,3,4,5,6,7,8,9,0};
    int *p;
    p=a;
    printf("下标4的值:%d\n",a[4]); //5
    printf("下标4的值:%d\n",*(a+4)); //5
    printf("下标4的值:%d\n",*(p+4)); //5
    return 0;
}

6.2 指针访问一维数据常用的操作方式:字符串

#include <stdio.h>
#include <string.h>
int main()
{
    char str[]="1234567890";
    char *p=str;
    int len=0;
    printf("p=%s,str=%s\n",p,str);
    //计算字符串的长度
    while(*p++!='\0')
    {
        len++;
    }
    printf("len=%d\n",len);
    return 0;
}

6.3 指针自增和自减?++和—运算符

#include <stdio.h>
#include <string.h>
int main()
{
    int a[]={1,2,3,4,5,6,7,8,9,0};
    int *p=a;
    printf("%d\n",*p);   //1
    printf("%d\n",*p++); //1
    printf("%d\n",*p);   //2
    printf("%d\n",*(p+3));//5
    printf("%d\n",*p);//2
    printf("%d\n",*(++p));//3
    printf("%d\n",*p);//3
    printf("%d\n",*p--);//3
    printf("%d\n",*p);//2
    return 0;
}

6.4 指针自增自减偏移字节是多少?

与指针本身的类型有关系。

#include <stdio.h>
#include <string.h>
int main()
{
    /*
    int a[]={1,2,3,4,5,6,7,8,9,0};
    int *p=a;
    printf("偏移之前的地址:p=%#x\n",p);
    *(p++);
    printf("%d\n",*p);   //2
    printf("偏移之后的地址:p=%#x\n",p);
    */
    char a[]={1,2,3,4,5,6,7,8,9,0};
    char *p=a;
    printf("偏移之前的地址:p=%#x\n",p);
    *(p++);
    printf("%d\n",*p);   //2
    printf("偏移之后的地址:p=%#x\n",p);
    return 0;
}

6.5 数组本身可以当做指针使用吗?

不可以

指针特点: 自增、自减、可以改变指向。

#include <stdio.h>
#include <string.h>
int main()
{
    int a[]={1,2,3,4,5}; //*(a+3)
    int b[]={11,12,13,14,15};
    //下面3行代码是错误的
    a--;
    a++;
    a=b;
    return 0;
}

6.6 指针可以当做数组使用吗?

可以

数组特点: 可以通过下标访问数组成员。

#include <stdio.h>
#include <string.h>
int main()
{
    int a[]={1,2,3,4,5};
    int *p=a;
    printf("%d\n",a[0]);
    printf("%d\n",p[0]); //*p
    return 0;
}

7. 数组指针

数组指针可以指向一个一维数组,行指针也叫一维数组指针。

定义语法: char (*p)[5]; 该指针指向一个二维数组里的一个一维数组地址,一维数组的成员是5个字节。

二维数组的定义方法: char a[10][5];

#include <stdio.h>
#include <string.h>
int main()
{
    int (*p)[5]; //定义一个一维数组指针---行指针
    int a[2][5]=
    {
        {1,2,3,4,5},
        {6,7,8,9,10}
    };
    p=a; //将a地址给p指针
    printf("%d\n",p[0][2]);
    
    p++; //加一个一维数组的大小
    printf("%d\n",p[0][2]);
    return 0;
}

8. 指针数组

指针数组: 表示该数组成员可以存放指针。

指针数组定义语法:int *p[5]; 表示定义一个int数组,该数组的类型可以存放5个int类型的指针变量(地址)。

#include <stdio.h>
#include <string.h>
int main()
{
    int a,b,c;
    int *p[3]; //一次定义3个int类型的指针变量
    //存放地址
    p[0]=&a;
    p[1]=&b;
    p[2]=&c;
    //对空间赋值
    *p[0]=123;
    *p[1]=456;
    *p[2]=789;
    //取出数据
    printf("%d\n",*p[0]);
    printf("%d\n",*p[1]);
    printf("%d\n",*p[2]);
    return 0;
}

#include <stdio.h>
#include <string.h>
int main()
{
    char a[][100]={"小明","小白","小李"};
    char *p[]={"小明","小白","小李"};
    
    printf("%s\n",a[0]);
    printf("%s\n",p[0]);
    return 0;
}

9. 指针类型常见的初始化值:NULL

#include <stdio.h>
#include <string.h>
int main()
{
    char *p=NULL; // (void*)0 == NULL
    printf("%#x\n",p);
    if(p!=NULL)
    {
        //判断指针是否可以使用
    }
    return 0;
}
目录
相关文章
|
29天前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
84 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
25天前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
114 14
|
29天前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
50 9
|
29天前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
44 7
|
29天前
|
C语言
【C语言】全局搜索变量却找不到定义?原来是因为宏!
使用条件编译和 `extern` 来管理全局变量的定义和声明是一种有效的技术,但应谨慎使用。在可能的情况下,应该优先考虑使用局部变量、函数参数和返回值、静态变量或者更高级的封装技术(如结构体和类)来减少全局变量的使用。
35 5
|
30天前
|
编译器 C语言
【C语言】宏定义在 a.c 中定义,如何在 b.c 中使用?
通过将宏定义放在头文件 `macros.h` 中,并在多个源文件中包含该头文件,我们能够在多个文件中共享宏定义。这种方法不仅提高了代码的重用性和一致性,还简化了维护和管理工作。本文通过具体示例展示了如何定义和使用宏定义,帮助读者更好地理解和应用宏定义的机制。
45 2
|
2月前
|
存储 算法 C语言
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
102 4
|
2月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
2月前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
119 3
|
2月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。