首页 > 其他分享 >C语言指针详解与应用

C语言指针详解与应用

时间:2024-09-21 15:50:36浏览次数:10  
标签:return 字节 int max C语言 详解 printf 指针

C语言指针

1.指针简介

  • 指针与底层硬件紧密联系,使用指针可操作数据地址,实现数据的间接访问

2.计算机存储机制

外链图描述

在C语言中内存的分配是以一个字节为单位进行线性分配且每个字节都会对应的地址

  • int a = 0x12345678;

  • short b = 0x5A6B;

  • char c[] = {0x33,0x34,0x35 };

**int:**一个int 32字节,那么一个int则跨越四个地址,存储规则为:小段模式(小段在前)

目前计算机常用小段在前的分配方式

**数组:**数组在内存中是一个连续的空间

3.定义指针

  • 指针即指针变量,用于存放其他数据单元(变量,数组,结构体,函数等)的首地址。若指针存放了某个数据单元的首地址,则这个指针指向了这个数据单元,若指针存放的值为0,则这个为空指针
  • 定义一个指针变量:
数据类型字节指向该数据类型的指针字节
(unsigned)char1字节(unsigned)char*x字节
(unsigned)short2字节(unsigned)short*x字节
(unsigned)int4字节(unsigned)int*x字节
(unsigned)long4字节(unsigned)long*x字节
float4字节float*x字节
double8字节double*x字节
  • 16位系统:x=2,32位系统:x=4,64位系统:x=8

以下为通过代码对各数据类型的字节查看

整型:

#include <stdio.h>

int main()
{
	int a;
	//指向int*的指针变量 
	int *p;
	
	//sizeof用来查看占用多少字节 
	printf("%d\n",sizeof(a));
	printf("%d\n",sizeof(p));
	
	return 0;
}

输出结果如下:

4
4

--------------------------------
Process exited after 0.009431 seconds with return value 0

字符型:

#include <stdio.h>

int main()
{
	char a;
	//指向int*的指针变量 
	char *p;
	
	//sizeof用来查看占用多少字节 
	printf("%d\n",sizeof(a));
	printf("%d\n",sizeof(p));
	
	return 0;
}

输出结果如下:

1
4

--------------------------------
Process exited after 0.008878 seconds with return value 0

4.指针的操作

  • 若已定义:

int a; //定义一个int型数据

int *p //定义一个指向int型的数据

  • 则对定义指针P有如下操作方式:
操作方式举例解释
取地址p=&a;将数据a的首地址赋值给p
取内容*p;取出指针指向的数据单元
p++;使指针向下移动1个数据宽度
p=p+5使指针向下移动5个数据宽度
p–;使指针向上移动1个数据宽度
p=p-5使指针向上移动5个数据宽度

代码演示:

取地址与取内容:

#include <stdio.h>

int main()
{
	char a = 0x66;
	//指向int*的指针变量 
	char *p;
	p = &a;
	//sizeof用来查看占用多少字节 
	printf("%x\n",a);
	printf("%x\n",p);
    //取出指针p的内容
	printf("%x\n",*p);
	
	return 0;
}

输出结果:

66
62fecb
66

--------------------------------
Process exited after 0.009014 seconds with return value 0

实际上a存储在了62fecb这个地址,该地址为程序分配

指针加法演示:

#include <stdio.h>

int main()
{
	int a = 0x66;
	//指向int*的指针变量 
	int *p;
	p = &a;
	//sizeof用来查看占用多少字节 
	printf("%x\n",a);
	printf("%x\n",p);
	printf("%x\n",*p);
	
	p++;
	printf("%x\n",p);
	
	return 0;
}

输出结果:

66
62fec8
66
62fecc

--------------------------------
Process exited after 0.01018 seconds with return value 0

通过计算62fec8-62fecc=4;可得通过P++后,指针向下移动一个数据宽度

如将p++改为p–则结果相反

5.数组与指针

,在这里插入图片描述

  • 数组是一些相同数据类型的变量组成的集合,其数组名即为指向该数据类型的指针。数组的定义等效于申请内存、定义指针和初始化

例如:char c[] = {0x33,0x34,0x35};

等效于:申请内存

​ 定义char *c = 0x4000;

​ 初始化数组数据

  • 利用下标引用数组数据也等效于指针取内容

例如: C[0]; 等效于:*C

​ C[1];等效于:*(C+1);

​ C[2];等效于: *(C+2);

代码演示:

#include <stdio.h>
#include <stdlib.h>

int main()
{
//	char a[]={0x33,0x34,0x35};
	int *a;
	a = (int*)malloc(3*4);
	*a = 0x33;
	*(a+1)=0x34;
	*(a+2)=0x35;
	
	printf("char[0]=%x\n",a[0]);
	printf("char[0]=%x\n",a[1]);
	printf("char[0]=%x\n",a[2]);
	printf("\n");

	printf("*a=%x\n",*a);
	printf("*(a+1)=%x\n",*(a+1));
	printf("*(a+2)=%x\n",*(a+2));		
	
	return 0;
}

输出结果:

char[0]=33
char[0]=34
char[0]=35

*a=33
*(a+1)=34
*(a+2)=35

--------------------------------
Process exited after 0.0111 seconds with return value 0

6.指针的注意事项:

  • 在对指针取内容之前,一定要确保指针指在了合法的位置,否则将会导致程序出现不可预知的错误
  • 同级指针之间才能相互赋值,跨越赋值将会导致编译器出错

在这里插入图片描述

7.指针的应用

  • 传递参数

    1.使用指针传递大容量参数,主函数与子函数使用的是同一套数据,避免了参数传递过程中的数据复制,提高了运行效率,减少了内存占用

    2.使用指针传递输出参数,利用主函数和子函数同一套数据的特性,实现数据返回,可实现多返回值函数的设计

  • 传递返回值

​ 1.将模块内的公有部分返回,让主函数持有模块的“句柄”,便于程序对指定对象的操作

  • 直接访问物理地址下的数据

    1.访问硬件指定内存下的数据,如设备ID号等

    2.将复杂的格式数据转换为字节,方便通讯与存储

    代码演示:

    参数的传递:

    #include <stdio.h>
    #include <stdlib.h>
    
    //const表示该数据只读 
    int FindMAX(const int *data,int c)
    {
    	int i;
    	int max=data[0];
    	for(i=1;i<=c;i++)
    	{
    		if(data[i]>max)
    		{
    			max=data[i];
    		}
    	}
    	return max;
    	
    }
    int main()
    {
    	int a[]={2,3,4,4,5,6};	
    	int max;
    	
    	max=FindMAX(a,5);
    	
    	printf("max=%d\n",max);
    	
    	
    	return 0;
    }
    

    输出结果:

    max=6
    
    --------------------------------
    Process exited after 0.009708 seconds with return value 0
    

    多返回值函数:

    #include <stdio.h>
    #include <stdlib.h>
    
    //const表示该数据只读 
    void FindMAX(int *max,int *count,int *data,int length)
    {
    	int i;
    	*max=data[0];
    	*count=1;
    	for(i=1;i<=length;i++)
    	{
    		if(data[i]>*max)
    		{
    			*max=data[i];
    			*count = 1;
    		}else if(data[i]==*max)
    		{
    			(*count)++;
    		}
    	}
    	
    }
    int main()
    {
    	int a[]={6,3,4,4,5,6};	
    	int max;
    	int count;
    	
    	FindMAX(&max,&count,a,5);
    	
    	printf("max=%d\n",max);
    	printf("count=%d\n",count);
    	
    	return 0;
    }
    

    输出结果:

    max=6
    count=2
    
    --------------------------------
    Process exited after 0.009176 seconds with return value 0
    

标签:return,字节,int,max,C语言,详解,printf,指针
From: https://blog.csdn.net/2301_78731196/article/details/142418391

相关文章

  • 全面解析 JDK17新特性:密封类、模式匹配、文本块、垃圾回收等最新功能详解
    引言JDK17作为Java的长期支持(LTS)版本,引入了许多新特性和改进,这些更新不仅提升了代码的可读性和可维护性,还增强了性能。本文将详细探讨JDK17的关键新特性,包括密封类、模式匹配、文本块、增强的垃圾回收机制等,并附上代码示例,帮助你更好地理解和应用这些特性。1.密封......
  • Nginx配置详解
    #nginx进程数,建议设置为等于CPU总核心数。worker_processes1;#事件区块开始events{#单个进程最大连接数(最大连接数=连接数*进程数)#根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连......
  • Java免税商品购物商城:Spring Boot实现详解
    第一章绪论1.1课题开发的背景从古至今,通过书本获取知识信息的方式完全被互联网络信息化,但是免税商品优选购物商城,对于购物商城工作来说,仍然是一项非常重要的工作。尤其是免税商品优选购物商城,传统人工记录模式已不符合当前社会发展和信息管理工作需求。对于仓储信息管理......
  • 2025届必看:Java SpringBoot搭建大学生资助管理系统,详解功能模块,实现学生信息高效管理!
    ✍✍计算机毕业编程指导师**⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java、Python、微信小程序、大数据实战项目集⚡⚡文末......
  • 第一节,编程起源C语言,初阶入门
    C语言介绍1.C语言由来C语言之父通常是指丹尼斯·里奇(DennisRitchie)。他是贝尔实验室的计算机科学家,与肯·汤普逊(KenThompson)一起设计并实现了C语言。C语言于1972年发布,对后来的计算机科学和技术发展产生了深远影响,特别是在系统软件、嵌入式系统以及许多编程语言的设计中......
  • 提升数字化校园管理效率:资产领用功能详解
    在现代教育领域,数字化校园资产管理系统已成为提高学校运营效率和资产利用率的关键手段。其中,资产领用功能作为数字化校园管理系统的核心功能之一,扮演着重要的角色。本文将为您介绍数字化校园资产管理中的资产领用功能,帮助您深入了解其作用和优势。数字化校园资产管理系统的资产领用......
  • Vue3 之hooks 使用详解教程
    一、基本使用<template><view>{{params}}<button@click="goUrl('/pages/index/index')">跳转</button></view></template><script>import{ref,onMounted......
  • Python 中的 strip() 和 split() 方法详解
    目录一、strip()方法1.什么是strip()?2.基本语法3.基本用法示例1)去除空白字符2)移除指定字符4.lstrip()和rstrip()5.注意事项二、split()方法1.什么是split()?2.基本语法3.基本用法示例1)按空格分割字符串2)指定分隔符3)限制分割次数4.rsplit()方法......
  • 59.【C语言】内存函数(memmove函数)
    2.memove函数*简单使用memove:memorymovecplusplus的介绍点我跳转对比第59篇的memcpy函数对比memmcpy函数的介绍如下区别:部分翻译memmove多了:Copyingtakesplaceasifanintermediatebufferwereused(复制就像中间的缓存区使用一样),allowingthedestinati......
  • C语言定时器编程深入研究
    定时器是操作系统提供的用于计时的功能之一,常用于控制程序中的延时操作或周期性任务。本篇文章将详细介绍如何使用C语言处理定时器,包括基本的定时器设置方法、自定义定时器处理函数以及一些高级主题。1.引言定时器是操作系统向进程提供的一个用于计时的功能。在C语言中,......