iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言指针和数组应用实例分析
  • 225
分享到

C语言指针和数组应用实例分析

2023-06-30 05:06:35 225人浏览 泡泡鱼
摘要

这篇文章主要介绍“C语言指针和数组应用实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言指针和数组应用实例分析”文章能帮助大家解决问题。一、指针和数组分析-上1.数组的本质数组是一段连续的

这篇文章主要介绍“C语言指针和数组应用实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言指针和数组应用实例分析”文章能帮助大家解决问题。

一、指针和数组分析-上

1.数组的本质

  • 数组是一段连续的内存空间

  • 数组的空间大小为 sizeof(array_type) * array_size

  • 数组名可看做指向数组第一个元素的常量指针

下面看一段代码:

#include <stdio.h> int main(){    int a[5] = {0};    int* p = NULL;        printf("a = 0x%X\n", (unsigned int)(a));    printf("a + 1 = 0x%X\n", (unsigned int)(a + 1));        printf("p = 0x%X\n", (unsigned int)(p));    printf("p + 1 = 0x%X\n", (unsigned int)(p + 1));        return 0;}

输出结果如下:

C语言指针和数组应用实例分析

通过这段代码说明指针运算是合法的。

2.指针的运算

指针是一种特殊的变量,与整数的运算规则为

p + n; <-->(unsigned int)p + n*sizeof(*p);

结论∶

当指针 p 指向一个同类型的数组的元素时:p+1 将指向当前元素的下一个元素;p-1 将指向当前元素的上一个元素。

  • 指针之间只支持减法运算

  • 参与减法运算的指针类型必须相同

p1- p2; <--> ((unsigned int)p1 - (unsigned int)p2) / sizeof(type);

注意:

  • 只有当两个指针指向同一个数组中的元素时,指针相减才有意义,其意义为指针所指元素的下标差

  • 当两个指针指向的元素不在同一个数组中时,结果未定义

下面看一段简单的指针运算代码:

#include <stdio.h> int main(){    char s1[] = {'H', 'e', 'l', 'l', 'o'};    int i = 0;    char s2[] = {'W', 'o', 'r', 'l', 'd'};    char* p0 = s1;    char* p1 = &s1[3];    char* p2 = s2;    int* p = &i;    printf("%d\n", p0 - p1);    //printf("%d\n", p0 + p2);  //ERROR    printf("%d\n", p0 - p2);    //printf("%d\n", p0 - p);   //ERROR    //printf("%d\n", p0 * p2);  //ERROR    //printf("%d\n", p0 / p2);  //ERROR    return 0;}

输出结果如下:

C语言指针和数组应用实例分析

注意两个指针指向不同的数组,虽然它们两相减符合语法,但是最后的结果肯定没有意义。

再来看一段指针运算的应用代码:

#include <stdio.h> #define DIM(a) (sizeof(a) / sizeof(*a)) int main(){    char s[] = {'H', 'e', 'l', 'l', 'o'};    char* pBegin = s;    char* pEnd = s + DIM(s); // Key point    char* p = NULL;        printf("pBegin = %p\n", pBegin);    printf("pEnd = %p\n", pEnd);        printf("Size: %d\n", pEnd - pBegin);    for(p=pBegin; p<pEnd; p++)    {        printf("%c", *p);    }        printf("\n");       return 0;}

输出结果如下:

C语言指针和数组应用实例分析

注意以下几点:

  • 数组大小的计算方法:#define DIM(a) (sizeof(a) / sizeof(*a))

  • char* pEnd = s + DIM(s); // Key point ==> pEnd 指向 'o' 后面的地址 ==> 这在 C 语言中是一个擦边球的边界位置,也是一个技巧,在这个边界位置可以认为该指针是合法的,可以和其他指针进行比较运算和减法运算等,在 c++ 标准库里面也合法

3.指针的比较

  • 指针也可以进行关系运算 (<,<=,>,>=)

  • 指针关系运算的前提是同时指向同一个数组中的元素

  • 任意两个指针之间的比较运算(==,!=)无限制

  • 参与比较运算的指针类型必须相同

4.小结

  • 数组声明时编译器自动分配一片连续的内存空间

  • 指针声明时只分配了用于容纳地址值的 4 字节空间

  • 指针和整数可以进行运算,其结果为指针

  • 指针之间只支持减法运算,其结果为数组元素下标差

  • 指针之间支持比较运算,其类型必须相同

二、指针与数组分析-下 

1.数组的访问方式

以下标的形式访问数组中的元素

C语言指针和数组应用实例分析

以指针的形式访问数组中的元素

C语言指针和数组应用实例分析

2.下标形式 VS 指针形式

  • 指针以固定增量在数组中移动时,效率高于下标形式

  • 指针增量为1且硬件具有硬件增量模型时,效率更高

  • 下标形式与指针形式的转换

a[n] <--> *(a +n) <--> *(n + a) <--> n[a]

注意:现代编译器的生成代码优化率已大大提高,在固定增量时,下标形式的效率已经和指针形式相当;但从可读性和代码维护的角度来看,下标形式更优。

下面看一个数组的访问方式代码:

#include <stdio.h> int main(){    int a[5] = {0};    int* p = a;    int i = 0;        for(i=0; i<5; i++)    {        p[i] = i + 1;    }        for(i=0; i<5; i++)    {        printf("a[%d] = %d\n", i, *(a + i));    }        printf("\n");        for(i=0; i<5; i++)    {        i[a] = i + 10;    }        for(i=0; i<5; i++)    {        printf("p[%d] = %d\n", i, p[i]);    }        return 0;}

输出结果如下:

C语言指针和数组应用实例分析

注意这个奇怪的写法:i[a] = i + 10; ==> a[i] = i + 10;

下面通过一个实例,说明数组和指针的不同:

ext.c:

int a[] = {1, 2, 3, 4, 5};

test.c:

#include <stdio.h> int main(){    extern int a[];        printf("&a = %p\n", &a);    printf("a = %p\n", a);    printf("*a = %d\n", *a);     return 0;}

输出结果如下:

C语言指针和数组应用实例分析

下面来验证一下数组名究竟是不是指针,将 test.c 改成:

#include <stdio.h> int main(){    extern int* a;        printf("&a = %p\n", &a);    printf("a = %p\n", a);    printf("*a = %d\n", *a);     return 0;}

输出结果如下:

C语言指针和数组应用实例分析

ext.c 中 a[ ] 的地址为 0x804a014,test.c 中的extern int* a; 只是申明标识符 a,编译器会认为在这之前就已经给了地址值,就是 0x804a014,所以printf("a = %p\n", a); 就是打印0x804a014 地址中的 4 个字节的数,也就是 a[ ] 数组中的第一个元素 1,所以打印 0x1,*a 就是取 0x1 地址中的数,但是这个地址值是留给操作系统的,不可访问,访问就会产生段错误。

3.a 和 &a 的区别

  • a 为数组首元素的地址

  • &a 为整个数组的地址

  • a 和 &a 的区别在于指针运算

C语言指针和数组应用实例分析

这个就能看出 a + 1 和 &a + 1 的不同,a + 1 增加的步长是一个元素的大小,&a + 1 则是增加的步长是整个数组的大小。

下面看一个指针运算的经典问题:

#include <stdio.h> int main(){    int a[5] = {1, 2, 3, 4, 5};    int* p1 = (int*)(&a + 1);     int* p2 = (int*)((int)a + 1);    int* p3 = (int*)(a + 1);        printf("%d, %d, %d\n", p1[-1], p2[0], p3[1]);        return 0;}

输出结果如下:

C语言指针和数组应用实例分析

p1[-1] 就是 *(p1 - 1),由于 p1 指向的元素是 5 后面的位置,减 1 之后就指向了 5;p2 的地址是 0x804a015(注意 linux 系统为小端系统),*p2 就是 0x02000000,对应十进制的值就是 33554432;p3 的地址为 &a[1],所以 p3[1] 就是 3 了。

C语言指针和数组应用实例分析

4.数组参数

数组作为函数参数时,编译器将其编译成对应的指针

C语言指针和数组应用实例分析

结论:一般情况下,当定义的函数中有数组参数时,需要定义另一个参数来标示数组的大小。

下面看一段代码:

#include <stdio.h> void func1(char a[5]){    printf("In func1: sizeof(a) = %d\n", sizeof(a));        *a = 'a';        a = NULL;} void func2(char b[]){    printf("In func2: sizeof(b) = %d\n", sizeof(b));        *b = 'b';        b = NULL;} int main(){    char array[10] = {0};        func1(array);        printf("array[0] = %c\n", array[0]);        func2(array);        printf("array[0] = %c\n", array[0]);        return 0;}

输出结果如下:

C语言指针和数组应用实例分析

这段代码就说明数组参数退化成指针,因为 sizeof(a) 为 4 个字节,而不是 5 个字节。

关于“C语言指针和数组应用实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网其他教程频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: C语言指针和数组应用实例分析

本文链接: https://www.lsjlt.com/news/327479.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言指针和数组应用实例分析
    这篇文章主要介绍“C语言指针和数组应用实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言指针和数组应用实例分析”文章能帮助大家解决问题。一、指针和数组分析-上1.数组的本质数组是一段连续的...
    99+
    2023-06-30
  • C语言深入分析数组指针和指针数组的应用
    目录一、数组类型二、定义数据类型三、数组指针四、指针数组五、小结一、数组类型 C语言中的数组有自己特定的类型数组的类型由元素类型和数组大小共同决定 例:int array[5] 的类...
    99+
    2024-04-02
  • C语言指针应用实例分析
    这篇文章主要讲解了“C语言指针应用实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言指针应用实例分析”吧!1、指针是什么指针理解的2个要点:平时口语中说的指针,通常指的是指针变量,...
    99+
    2023-06-30
  • C语言数组指针和指针数组怎么应用
    这篇文章主要介绍“C语言数组指针和指针数组怎么应用”,在日常操作中,相信很多人在C语言数组指针和指针数组怎么应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言数组指针和指针数组怎么应用”的疑惑有所帮助!...
    99+
    2023-06-30
  • C语言指针使用实例分析
    今天小编给大家分享一下C语言指针使用实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。何为指针指针这玩意说白了,就是用来...
    99+
    2023-07-02
  • C语言指向函数的指针实例分析
    这篇文章主要介绍“C语言指向函数的指针实例分析”,在日常操作中,相信很多人在C语言指向函数的指针实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言指向函数的指针实例分析”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-02
  • C语言指针运算实例分析
    这篇文章主要介绍“C语言指针运算实例分析”,在日常操作中,相信很多人在C语言指针运算实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言指针运算实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-30
  • C语言指针综合应用的示例分析
    这篇文章将为大家详细讲解有关C语言指针综合应用的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。指针是什么?指针是c语言中的一个重要概念,也是C语言的一个重要的特色,正确而灵活地运用它,可以使程序简...
    99+
    2023-06-29
  • C语言中指针和数组试题详解分析
    目录数组题:程序一(一维数组):字符数组程序二(字符数组):程序三(字符数组):程序四(字符数组):程序五(字符数组):二维数组程序六( 二维数组):指针题程序七( 指针):程序八(...
    99+
    2024-04-02
  • C语言数组指针和指针数组有什么区别
    这篇文章主要讲解了“C语言数组指针和指针数组有什么区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言数组指针和指针数组有什么区别”吧!区别:指针数组本身是一个数组,数组的元素都是指针,...
    99+
    2023-06-20
  • c语言指针数组和数组指针有什么区别
    C语言中,指针数组和数组指针是两种不同的概念。 指针数组(Pointer Array):指针数组是一个数组,其中的元素都是指针类型...
    99+
    2023-10-27
    c语言
  • C语言基础野指针与空指针示例分析
    目录一:野指针野指针的成因1. 指针未初始化2. 指针越界访问3 .指针释放后未置空规避野指针1. 初始化指针 2. 避免指针越界 3 避免返回局部变量的地址 4. 开辟的指针释放后...
    99+
    2024-04-02
  • C语言指针数组案例详解
    指针与数组是 C 语言中很重要的两个概念,它们之间有着密切的关系,利用这种 关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针与数组之 间的联系及在编程中的应用。 1.指...
    99+
    2024-04-02
  • C语言指针引用数组案例讲解
    前言:C语言中指针玩的是什么,是内存,要想学好指针的小伙伴们要先对数据在内存中是怎么玩的做一番了解~       当在...
    99+
    2024-04-02
  • C语言指针数组和数组指针的区别有哪些
    这篇“C语言指针数组和数组指针的区别有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言指针数组和数组指针的区别有哪些...
    99+
    2023-07-04
  • C语言例题讲解指针与数组
    目录1.概要复习2.指针与数组笔试题2.1一维数组2.2字符数组2.3字符串数组2.4字符串指针2.5二维数组1.概要复习 本篇的内容主要围绕指针与数组、指针与字符串等之间的关系,以...
    99+
    2024-04-02
  • 解析Go语言和C语言指针的特性及应用
    Go语言和C语言是两种非常常见的编程语言,它们都支持指针的概念,但在使用方式和语法上有一些不同。本文将对Go语言和C语言的指针特性进行详细解析,并通过具体的代码示例来说明其应用。 一、...
    99+
    2024-03-07
    go指针应用 c指针特性 编程语言指针 go语言
  • Go语言和C语言指针区别对比分析
    Go语言和C语言是两种常用的编程语言,它们在指针的使用上有着一定的区别。本文将通过具体的对比分析以及代码示例来说明Go语言和C语言中指针的区别。 一、概述指针是一种用来存储变量地址的特...
    99+
    2024-03-07
    go语言 c语言 指针
  • C++中指针实例分析
    这篇文章主要介绍“C++中指针实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++中指针实例分析”文章能帮助大家解决问题。计算机的内存模型CPU是计算机的核心部件,要想让一个CPU工作,就必...
    99+
    2023-06-19
  • C语言结构体指针的示例分析
    这篇文章给大家分享的是有关C语言结构体指针的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。写结构体指针前,先说一下 . 号和 -> 的区别记得当初刚学C语言的...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作