C语言学习笔记:指针

✨博文作者:烟雨孤舟
💖 喜欢的可以 点赞 收藏 关注哦~~

✍️ 作者简介: 一个热爱大数据的学习者

✍️ 笔记简介:作为大数据爱好者,以下是个人总结的学习笔记,如有错误,请多多指教!

目录

简介

指针变量的定义

指针变量初始化

指针变量的引用

指针的基本运算

指针的算术运算

指针和函数

指针和数组

指针和字符串


简介

每一个变量都有一个内存位置。指针就是变量的内存地址,指针变量是用来存放内存地址的变量,就像其他变量一样,在使用指针存储其他变量地址之前,要对其进行声明。指针变量的值是个地址,这个地址不仅可以是变量的地址也可以是其他数据结构的地址(数组、函数等)。为了表示指针变量和它所指向的变量之间的关系,在程序使用 *表示指向

指针变量的定义

变量或程序代码在程序运行时会被以字节为单元存储在存储器中,程序会根据变量类型分配相应大小的内存单元,内存单元分为内存内容与内存地址,内存内容一般为变量的实际值,内存地址就是程序分配给变量的地址指针就是用于访问和操作地址的。
指针的大小取决于计算机体系结构和操作系统的位数。在32位操作系统中,指针通常为4字节;在64位操作系统中,指针通常为8字节。

指针就是内存地址,指针变量是用来存放内存地址的。
指针变量声明的一般形式为:
    type *var_name;
    类型标识符 *变量名;
    int a=3;
    int *ip;    /* 声明一个整型的指针 */
    ip =&a;   //将a的地址赋值给ip;*ip的值就是a的值
定义指针和使用指针是*的意义不同,int *a=&b;表示为指针变量a指向b的地址,即a=&b而不是*a=&b,*a为b的值。在指针变量定义或初始化时变量名之前的*只表示该该变量是一个指针变量,引用指针变量是*则表示间接访问。
指针变量的定义:
    指针变量的类型决定了它所能指向的变量的类型
    指针变量并不固定指向一个变量,可指向同类型的不同变量。
    指针变量定义后,变量值不能确定,应用前必须先赋值。
    指针变量只能存放地址,不能将一个非地址类型的数据(如常量值)赋给一个指针变量,但0(NULL)除外
两个指针运算符:& *
    &:取变量的地址
    *:取指针所指向的内容

 

 

指针变量初始化

一般形式:
	数据类型 *指针名 =初始地址值;
例如:
	int i; 
	int*p=&i;
	//指针变量只能指向定义时所规定的变量
	int i, *p=&i;
	//指针变量和指向定义时所规定类型的变量同时定义
	int i, *p=&i;
	int *q=p;
	//用已初始化的指针变量作为初始值

指针变量的引用

定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。指针的类型必须与它所指变量的类型相同。

两个有关的运算符:
    &:取地址运算符。
    *:指针运算符或称“间接访问”运算符,访问指针变量所指向的对象。
需要注意的是指针运算符*和指针变量说明中的指针说明符*不是一回事。在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”则是一个运算符,用以表示指针变量所指的变量。

#include <stdio.h>
int main ()
{
   int  a = 20,int  *p;        /* 指针变量的声明 */
   p = &a;       /*将var的地址赋值给指针ip*/
   printf("a 变量的地址: %p\n", &var  );
   /* 在指针变量中存储的地址 */
   printf("ip 变量存储的地址: %p\n", p );
   printf("*p 变量的值: %d\n", *p );/* 使用指针间接访问值 */
   printf("a 变量的值: %d\n", a );/* 直接访问值 */
   return 0;
}

//a 变量的地址: 0x7ffeeef168d8
//p 变量存储的地址: 0x7ffeeef168d8
//*p 变量的值: 20
//a 变量的值:20

指针的基本运算

1.取地址运算和间接访问运算
int *p,a=3;
p = &a;
//将整型变量a的地址赋值给整型指针p,p的值就是a的地址,*p的值就是a的值
2.赋值运算符
int a=3,*p1,*p2;
p1=&a;
p2=p1;
//a的地址赋值给p1,p1的值为a的地址,把p1的值赋值给p2,p2的值为a的地址,*p1和*p2的值为a的值3.
赋值运算:
    int a=3; int *p=&a;
    //把变量的地址赋予指向的相同数据类型的指针变量
    int a=3;int *p; p=&a;
    //把变量a的值赋予给相同类型的指针变量
    int a=3,*p=&a,*q; q=p; 
    //将指针变量p的值赋值给q,p=a=q=3
    int a[5],*p=a;
    //将数组的首地址赋予指针变量 
    char *p="hellp";

    //把字符串的首地址赋予给指定字符类型的指针变量 

指针的算术运算

C语言支持3种格式的指针算术运算,包括指针加上整数,指针减去整数和两个指针相减。
加减运算:
    对于指向数组的指针变量,可以加上或减去一个数n,即将指针指向的位置前移或者后移n个单位
    int a[5],*p;
    p=a; //指向a0,数组名就是数组首个元素的地址
    p=p+1//指向a1
指针相减:
    两个指针相减,得到的是指针之间元素的个数。若指针p指向a[i],指针q指向a[j],则p-q等于i-j

 C 指针是一个用数值表示的地址。可以对指针进行四种算术运算:++、--、+、-。

设ptr是一个指向地址 1000 的整型指针,ptr++执行完运算之后,ptr 将指向位置 1004,因为 ptr 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 字节
指针的每一次递增,它其实会指向下一个元素的存储单元。
指针的每一次递减,它都会指向前一个元素的存储单元
指针在递增和递减时跳跃的字节数取决于指针所指向变量数据类型长度,比如 int 就是 4 个字节。

*p++或*(p++)    首先计算表达式的值为*p,然后p自增1
(*p)++    首先计算表达式的值为*p,然后*p自增1
*++p或*(++p)    首先将p自增1,然后计算表达式的值为*p
++*p或++(*p)    首先将(*p)自增1,然后计算表达式的值为(*p)

指针和函数

在一个指针变量中存放一个数组或一个函数的首地址有何意义呢?因为数组或函数都是连续存放的。通过访问指针变量取得了数组或函数的首地址,也就找到了该数组或函数。凡是出现数组、函数的地方都可以用一个指针变量来表示,只要在该指针变量中赋予数组或函数的首地址即可。

在c语言中指针也可以作为函数的参数,如果某个变量的地址作为函数的实参,相应的形参就是指针。
函数实参与形参之间的数据传递是单向的“值传递”方式,调用函数不能改变实参的值,指针变量作为函数参数时也遵守这一个规则。
调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向变量的值,这样的机制被称为引用调用。采用引用调用需要在函数定义时将指针作为函数的形参,在函数调用时把变量的地址作为实参。

指针和数组

如果定义了一个一维数组,系统会默认为数组分配一段连续的内存空间,此时定义一个指针,并把数组的第一个元素的起始地址赋值给该指针,则该指针就指向了这个数组。
当一个指针变量被初始化成数组名时,就说该指针变量指向了数组。
指针:也是一个变量,存储的数据是地址。
数组名:代表的是该数组最开始的一个元素的地址。
指针数组:int *ptr[MAX];
把ptr声明为一个指针数组,由多个整数指针组成。ptr中的每个元素,都是一个指向 int 值的指针。
例如:
int a[2]={1,2};
int *p =a[0];
//将数组元素a[0]的地址赋值给指针p,使p指向数组a的第一个元素

在使用指针数组存放多个相同数据类型的数据并进行运算时数组的长度在定义时必须给定,如果事先不知道数据的数量只能采用估计上限和利用指针实现存储空间的动态分配。

指针引用一维数组元素,可以用以下两种方法:
1.下标法:如a[i]或p[i]形式
2.指针法,如*(a+i)或*(p+i)。其中a是数组名,p是指向数组元素的指针变量,其初始值为p=a,即p的值为数组名(数组首元素的地址)。

指针与数组的区别:
1. 指针和数组保存的数据内容不同.指针保存指针变量,即保存数据的地址;数组保存同一类型数据的值
2. 指针用于动态数据结构,指针保存的数据可以改变;数组用于存储固定数目且数据类型相同的元素,数组的大小定了就不容易变了;
3. 指针用malloc()和free()来分配空间和释放空间,而数组是隐式分配和删除
4. 指针通常指向匿名数据,而数组自身就是数组名
5.作为函数参数时数组名就等于指针 

指针和字符串

在C语言中,可以用两种方法访问一个字符串:
    用字符数组存放一个字符串,然后输出该字符串。
    char string[]="IloveChina!";
    printf("%s\n",string);
    用字符串指针指向一个字符串。
    char*string="IloveChina!";
    printf("%s\n",string);

字符串的指针表示法:
    char *指针名;

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/30118.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业会计软件必备!深入了解为何选择会计软件以及其带来的好处

随着科技的发展&#xff0c;企业需要更加智能化和数字化的财务管理方式&#xff0c;因此会计软件是现代社会的必然产物&#xff0c;会计软件可以帮助企业更有效地进行财务管理。 企业为什么需要会计软件&#xff1f; 提高准确度 通过传统的手工操作财务记录&#xff0c;会有很…

Linux常用命令——gcc命令

在线Linux命令查询工具 gcc 基于C/C的编译器 补充说明 gcc命令使用GNU推出的基于C/C的编译器&#xff0c;是开放源代码领域应用最广泛的编译器&#xff0c;具有功能强大&#xff0c;编译代码支持性能优化等特点。现在很多程序员都应用GCC&#xff0c;怎样才能更好的应用GCC…

【MySQL数据库】MySQL日志管理、备份与恢复

MySQL日志管理、备份与恢复 一、MySQL日志管理1.1日志存放位置 二、数据备份2.1物理备份与逻辑备份2.2完整备份、差异备份、增量备份2.3常见的备份方法 三、完整备份与恢复3.1物理冷备份与恢复3.2mysqldump 备份3.3mysqldump数据恢复3.4MySQL增量备份3.5MySQL增量恢复 一、MySQ…

【开发细节】SpringBoot配置文件的spring.profiles下的active和include属性的区别和作用

目录 问题作用spring.profiles.activespring.profiles.include 总结 问题 我们经常在项目的application.yml中看到这样的配置&#xff0c;如下&#xff1a; 在 Spring Boot 中&#xff0c;spring.profiles.active 和 spring.profiles.include 属性都是用来配置 profile 的。 …

【VB6|第18期】基于libxl导出Excel之导出失败的解决方案

日期&#xff1a;2023年6月12日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

安装Hive

安装Hive 准备 安装Java环境&#xff1a;Hive需要Java环境支持&#xff0c;所以需要先安装Java。安装文档&#xff1a;http://t.csdn.cn/deBJu 安装MySQL数据库。http://t.csdn.cn/d24pN 下载Hive 下载Hive的二进制文件。 链接&#xff1a;https://pan.baidu.com/s/1fdg7…

ubuntu 22.04部署dzzoffice及安装onlyoffice插件

目录 一、配置阿里源 二、安装数据库 三、安装依赖组件 &#xff08;一&#xff09;安装php7.4 &#xff08;二&#xff09;安装apache2 四、下载 dzzoffice 五、安装dzzoffice 六、安装onlyoffice插件 &#xff08;一&#xff09;从github下载小胡版onlyoffice替代原来…

Spring MVC 的创建连接和使用

目录 前言&#xff1a; MVC 是什么&#xff1f; 1. Spring MVC 项目的创建和连接&#xff1a; 1.1 创建 1.2 连接 2. RequestMapping 注解使用详析&#xff1a; 2.1 指定请求类型&#xff1a; 2.1.1 指定 GET 请求 2.1.2 指定 POST 请求 3. 参数的获取与传递&#xff1a; 3.1 传…

若依微服务 + seata1.5.2版本分布式事务(安装配置nacos+部署)

若依官方使用的1.4.0版本seata&#xff0c;版本较低配置相对更麻烦一些 一、seata服务端下载&#xff0c;下载方式介绍两种入口&#xff0c;如下&#xff1a; 1、找到对应版本&#xff0c;下载 binary 即可。 下载包名为&#xff1a;seata-server-1.5.2.zip 2. github上下载 …

Stable Diffusion WebUI 本地安装教学

Stable diffusion AI的绘图工具&#xff0c;这是一种扩散模型&#xff0c;可以通过不断去噪来获得最终的艺术作品。这款工具是当前最受欢迎的AI绘图工具之一&#xff0c;不仅是还是开源的&#xff0c;而且其中的AUTOMATIC111 Stable-diffusion-webui版本深受AI绘图玩家的喜爱&a…

《统计学习方法》——条件随机场#习题解答#

引言 这是统计学习方法第十一章条件随机场的阅读笔记&#xff0c;包含所有公式的详细推导。 条件随机场(conditional random field,CRF)是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型&#xff0c;其特点是假设输出随机变量构成马尔可夫随机场。 建议先阅…

低学历又如何?我这样的程序员照样可以逆袭

今天分享的这个主题&#xff0c;很可能会带来争议&#xff0c;因为目前优秀毕业生0年就可以拿到 20K 的待遇&#xff0c;这里暂且抛开硕士&#xff0c;985&#xff0c;211的 Top 前几高学校本科生。 毕竟今天的主题的初衷是地点低的程序员如何才能 2-3 年实现 20K 的目的&…

naive-ui NPopconfirm怎么用vue3的h()渲染

先看效果 然后我先贴代码&#xff0c; 你们看懂的先运行下&#xff0c; 文章后面我教你怎么 添加这种有template&#xff0c;有slot插槽的组件 h(NPopconfirm,{positiveButtonProps: {size: tiny,color: #007293,bordered: true,},negativeButtonProps: {size: tiny,color: #…

k8s 基本架构

k8s 中支持的 node 数 和 pod 数 k8s 也是逐步发展过来的&#xff0c;来看看以前和现在支持的 node 数 和 pod 数对比 node 即 节点 &#xff0c; 早期的 k8s 版本能够支持 100 台节点&#xff0c;现在 k8s 可以支持到 2000 台了 pod 数&#xff0c;早期的版本可以支持 1000 …

CleanMyMacX4.13.4中文免费版mac电脑管家

CleanMyMac X这款软件集成清理、mac保护、速度优化维护、应用程序管理和文件管理5大功能&#xff0c;使用过程安全高效&#xff0c;用户不必担心误操作导致系统的崩溃。作为一款专业的mac电脑系统管家&#xff0c;CleanMymac X一直致力于更加智能、便捷地全方位维护我们的电脑&…

最近跳槽,压力真大...

前几天&#xff0c;跟个老朋友吃饭&#xff0c;他最近想跳槽去大厂&#xff0c;觉得压力很大&#xff0c;问我能不能分享些所谓的经验套路。 每次有这类请求&#xff0c;都觉得有些有趣&#xff0c;不知道你发现没有大家身边真的有很多人不知道怎么面试&#xff0c;也不知道怎…

数据库表的操作

目录 前言 1.创建表 2.查看表 2.1查看表结构 2.2查看表中插入的数据 3.修改表 4.删除表 总结 前言 前面已经介绍了对数据库的操作&#xff0c;今天我们介绍的是数据库表的操作&#xff0c;数据库表简单可以理解为存储数据的介质。有了这个认识之后&#xff0c;下面我们…

系统架构设计师 2:计算机基础

一、计算机硬件 1 处理器&#xff08;CPU&#xff09; 处理器是计算机系统运算和控制的核心部件。 1.1 指令集 处理器的指令集按照其复杂程度可分为复杂指令集&#xff08;CISC&#xff09;与精简指令集&#xff08;RISC&#xff09;。 随着研究的深入&#xff0c;RISC已经…

Python面向对象编程1-面向过程的简单纸牌游戏程序 项目1.6 完整的猜大小纸牌游戏

总项目目标&#xff1a;用面向过程思想设计一个简单的纸牌游戏程序&#xff0c;称为"Higher or Lower"&#xff08;高还是低&#xff09;。游戏中&#xff0c;玩家需要猜测接下来的一张牌是比当前牌高还是低。根据猜测的准确性&#xff0c;玩家可以得到或失去相应的积…

2024考研408-计算机组成原理第三章-存储系统

文章目录 前言一、存储器概述1.1、层次结构1.2、存储器分类1.2.1、层次分类1.2.2、存储介质分类1.2.3、存取方式1.2.4、按照信息的可更改性&#xff08;读写、只读区别&#xff09; 1.3、存储器性能指标知识回顾 二、主存储器2.1、主存储器的基本组成&#xff08;介绍DRAM&…