C语言----指针

目录

1.概念

2.格式

3.指针操作符

4.初始化

1. 将普通变量的地址赋值给指针变量

a. 将数组的首地址赋值给指针变量

b. 将指针变量里面保存的地址赋值给另一个指针变量

5.指针运算

5.1算术运算

5.2 关系运算

指针的大小

总结:

段错误

指针修饰

1. const修饰

2. void

大小端

二级指针

指针和数组

1. 指针和一维数组

直接访问:

间接访问:

2. 指针和二维数组

直接访问:

间接访问:

数组指针

数组指针

定义:本质是指针,指向的是数组(又称行指针)

格式:存储类型数据类型(*指针变量名)[列数];

大小


指针的优点:

  1. 使程序更加简洁、紧凑、高效
  2. 有效的表达更复杂的数据结构
  3. 动态分配内存
  4. 得到多余一个数的函数的返回值

1.概念

地址:内存中每个字节单元都有点编号

指针:指针就是地址

指针变量:用于存放地址的变量叫做指针变量

2.格式

存储类型 数据类型 * 指针变量名

int* p;

使用:

int a=5;

int* p=&a;

char ch=‘t’;

char* p=&ch;

3.指针操作符

&:取地址符--->取变量的地址

*:取内容 --->取地址里面的内容

*&a==a;// *和&是互逆运算

// a是变量就是错的,a是地址就是对的

&*a

4.初始化

指针变量只使用前不仅要定义还要初始化,未初始化的指针变量是不能随便使用的,会产生野指针

int* p;

1. 将普通变量的地址赋值给指针变量

int a=10;
1)int* p=&a;//定义的同时赋值
2)int* p=NULL;//先定义指针变量在进行赋值
p=&a;

int* p = NULL; // int *p
p = &a;
printf("%d %d\n", a, *p);  // 打印 a 的值 10 10
printf("%p %p\n", &a, p);  // 打印 a 的地址*p = 3;
printf("%d %d\n", a, *p);  // 打印 a 的值 3 3
printf("%p %p\n", &a, p);  // 打印 a 的地址
a. 将数组的首地址赋值给指针变量

char str[10] = "hello";

char* p = str; // 指针指向数组的首地址,指向字符'h'的地址

b. 将指针变量里面保存的地址赋值给另一个指针变量

floatf = 1.3;

float* p = &f;

float* q = p;

5.指针运算

5.1算术运算

char str[32] = "hello";

char* p = str;

p++; // 指针向高地址方向移动一个数据单位(看数据类型),指针指向发生变化

p--; // 指针向低地址方向移动一个数据单位(看数据类型),指针指向发生变化

int* p; p++;// 移动4字节

double*p; p++; // 移动8字节

p+n:访问高地址方向第n 个数据的地址,指针指向不会发生变化

p-n:访问低地址方向第n 个数据的地址,指针指向不会发生变化

偏移了多少地址(字节) = n *sizeof(数据类型)

两个地址之间的差 = 两个地址之间相隔元素的个数

q - p=两个地址之间相隔的元素个数

char str[] = "hello";

char* p = str;

char* q = p+3;

printf("%d\n", q - p);

5.2 关系运算

> < == !=

指针之间的关系运算比较的是它指向地址的高低

高地址的指针大于低地址的指针

char str[32] = "hello";char* p1 = &str[1];
char* p2 = &str[3];p2 > p1注意:指向不同类型的数组指针关系运算没有意义,指向不同区域的指针关系运算也没有意义
(同一个数组间进行比较)

指针的大小

int a = 5;
int* p = &a; // 4
short b = 2;
short* p1 = &b;  // 4
double c = 1.1;
double* p2 = &c;  // 4szieof(指针变量名)32位操作系统:指针为4字节
8位16进制表示,4字节64位操作系统:指针为8字节
16位16进制表示,8字节

总结:

1.32位操作系统:指针为4字节, 64位操作系统:指针为8字节

2. 内存地址是固定的,但是变量的地址不固定的(栈区随机分配)

3. 指针类型根据指针指向空间的数据类型

段错误

Segentation fault (core dumped

1) 野指针,没有规定指向的指针会在内存中乱指,野指针产生原因

1. 指针变量定义没赋值

2. 指针 p被 free之后,没有置 NULL,会让人以为p是合法指针

解决:int* p = NULL;

2)内存泄漏,对非法空间进行赋值

指针修饰

1. const修饰

1) const int num = 10;

const int num = 10;

num = 3;

int* p = &num;

*p = 3; // 可以

2)const int *p;//修饰*p,指针指向的内容不能更改,指针指向可以修改

int const *p; //也可以这样修饰*p

int num=10;

const int* p=&num;

*p=20;//错误,因为*p被修饰

int sum=20;

p=&sum;//可以

3)int* const p;//修饰p,指针的指向不能修改,但是指针指向的内容可以修改

int num=10;

int sum=20;

int* const p=&num;

p=*sum;//错误

*p=20;//可以

4)修饰函数参数

2. void

void num;//不允许修饰变量void* p; //p是任意类型的指针,需要强转才能使用使用场景:函数参数或者函数返回值注意:通过void类型指针进行取内容,需要对地址进行强转强转方式:void* p=NULL;强转(int*)p 取内容*((int* )p)

大小端

TCP协议(三次握手四次挥手){网编时应用}

在计算机进行超过1字节数据进行储存时,会出现存储数据顺序不同的情况即大小端储存

Big-Endian(大端字节序)大端:在低地址存放高字节数据,高地址存放低字节数据

Little-Endian(小端字节序)小端:在低地址存放低字节数据,高地址存放高字节数据

举例:存储数据 0x12345678,起始地址 0x4000

0x4000 0x4001 0x4002 0x4003

大端:0x12 34 56 78

小端:0x78 56 34 12

查看电脑是大端还是小端,代码如下:

int a = 0x12345678;char b;b = (char)a;printf("%#x\n", b);// 电脑是小端,网络是大端// 电脑向网络传输东西,数据要从小端变成大端,传出去// 网络向电脑传输东西,数据要从大端转成小端,接收过来

二级指针

一级指针:存放变量地址

二级指针:存放的是一级指针的地址

格式: 存储类型 数据类型 **指针变量名

int num = 10;

int *p = &num;

int **q = &p;

访问 num 的值:

num *p **q

访问 num 的地址:

&num p *q

访问 p 的地址:

&p q

指针和数组

直接访问:按变量的地址存取变量的值(通过数组名访问)

间接访问:通过存放变量地址的变量去访问变量(通过指针访问)

1. 指针和一维数组

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

int *p = arr;

直接访问

int a[5] = {1, 2, 3, 4, 5};
int *p = a;
printf("%p %p %p\n", a, a+1, a+3);  // 直接访问元素的地址
printf("%d %d\n", a[1], *(a+1));
间接访问:

int a[5] = {1, 2, 3, 4, 5};
int *p = a;printf("%p %p %p\n", a, a+1, a+2);
printf("%p %p %p\n", p, p+1, p+2);
printf("%d %d %d\n", *p, *(p+1), *(p+2));
printf("%d %d %d\n", p[0], p[1], p[2]);
a 和 p 本质上不同,a地址常量, p是变量,a不能执行 ++ 操作,但是 p 可以访问数组元素a[i]的值:
直接访问:a[i] *(a+i)
间接访问:p[i] *(p+i)访问数组元素a[i]的地址:
直接访问:&a[i] a+i
间接访问:&p[i] p+i

inta[3] = {3, 2, 1};

int *p = a;

printf("%d\n", *p++);// 3在打印一次的话就是 2

printf("%d\n", *a++); //错误,a地址常量

运算方法:

1) ++和 *都是单目运算符,优先级相同

2) 单目运算符从右向左进行运算

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

int *p = a;

printf("%d\n",下列打印);

*(p++)// 3实际上指针指向到了第二个元素的地址

(*p)++// 打印出来是 3,实际上第一个元素值变成 4

++*p // 打印出来 4,自加完之后的值

++(*p) // 同上

*++p; // 2,先将指针向高地址方向移动一个数据单位,然后取地址内容

*(++p); // 同上

2. 指针和二维数组

int a[2][3]= {1, 2, 3, 4, 5, 6}; // a:数组名:表示第一行的首地址,a+1:第二行首地址

在a前面加*,表示将行地址降级为列地址

*a+0:第一行第一列的地址

*a+1:第一行第二列的地址

*(a+1):第二行第一列的地址

*(a+1)+1:第二行第二列的地址

a[0]:第一行第一列的地址

a[0]+1:第一行第二列的地址

a[1]:第二行第一列的地址

a[1]+1:第二行第二列的地址

直接访问:

间接访问:
数组指针

数组指针

定义:本质是指针,指向的是数组(又称行指针)

格式:存储类型数据类型(*指针变量名)[列数];

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

int (*p)[3] = a;

p:int (*)[3]; 运算三个三个运算

p可以代替a进行元素访问,但是本质不同

访问 a[i][j]的地址:

*(p+i)+j &p[i][j]p[i]+j

访问a[i][j]的元素

*(*(p+i)+j) *(p[i]+j)p[i][j]

大小

sizeof(p) ==4


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python应用——将Matplotlib图形嵌入Tkinter窗口

Python应用——将Matplotlib图形嵌入Tkinter窗口 目录 Python应用——将Matplotlib图形嵌入Tkinter窗口1 模块简介2 示例代码2.1 Matplotlib嵌入Tkinter2.2 Matplotlib嵌入Tkinter并显示工具栏 1 模块简介 Tkinter是Python的标准GUI&#xff08;图形用户界面&#xff09;库&…

【linux基础I/O(2)】理解文件系统|文件缓冲区|软硬链接|动静态库

目录 前言1. 理解C语言的缓冲区2. 对文件系统的初认识3. 理解软硬链接1. 软硬链接的特征2.软硬链接的作用 4. 理解动静态库5. 总结 前言 对于文件来讲,有打开的在内存中的文件,也有没有打开的在磁盘上文件,上一篇文章讲解的是前者,本篇文章将带大家了解后者! 本章重点: 本篇文…

什么是Redis的渐进式ReHash?

文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ Redis 的渐进式 rehash 是一…

Linux应用软件编程--网络通信(udp协议,tcp协议)

网络通信&#xff1a;不同主机&#xff0c;进程间通信&#xff0c;分为广域网和局域网 OSI 七层模型&#xff1a;是一种理论模型 应用层&#xff1a;通信传输的数据内容 http、FTP、TFTP、MQTT 表述层&#xff1a;数据加密&#xff0c;解密操作&#xff0c;压缩&#xff…

【C++】构造函数与析构函数

写在前面 构造函数与析构函数都是属于类的默认成员函数&#xff01; 默认成员函数是程序猿不显示声明定义&#xff0c;编译器会中生成。 构造函数和析构函数的知识需要建立在有初步类与对象的基础之上的&#xff0c;关于类与对象不才在前面笔记中有详细的介绍&#xff1a;点我…

【简博士统计学习方法】3. 统计学习方法的三要素

3. 统计学习方法的三要素 3.1 监督学习的三要素 3.1.1 模型 假设空间&#xff08;Hypothesis Space&#xff09;&#xff1a;所有可能的条件概率分布或决策函数&#xff0c;用 F \mathcal{F} F表示。 若定义为决策函数的集合&#xff1a; F { f ∣ Y f ( X ) } \mathcal{F…

【llm/ollama/qwen】在本地部署qwen2.5-coder并在vscode中集成使用代码提示功能

说在前面 操作系统&#xff1a;windows11ollama版本&#xff1a;0.5.4vscode版本&#xff1a;1.96.2continue插件版本&#xff1a;0.8.66 ollama安装 访问官网&#xff0c;点击下载安装即可 默认装在了C盘&#xff0c;比较蛋疼&#xff1b;但是可以指定路径安装&#xff1a;Ol…

PHP零基础入门笔记

表达式&#xff1a;任何有值的东西就是表达式 php可以解析双引号&#xff0c;不可以解析单引号&#xff0c;双引号中引用变量可以输出引用变量的值&#xff0c;但是单引号不可以 1.变量和变量的销毁 unset(变量名) //销毁变量 变量是严格区分大小写的&#xff0c;在php中…

macos安装java8

下载 dmg方式安装 安装 双击pkg运行 输入java -version验证 配置环境变量 cd ~ ls -a输入 ls -a后查看是否已经存在.bash_profile文件&#xff0c;如果已经存在就不需要创建&#xff0c;如果不存在&#xff0c;继续执行下方命令创建文件 touch .bash_profile /usr/l…

自定义校验注解

已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解) 1.自定义注解,并在注解上指定校验逻辑 Constraint(validatedBy StateValidation.class) // 指定校验逻辑 package com.example.demo.validation;import jakarta.validation.Constraint; import j…

指代消解:自然语言处理中的核心任务与技术进展

目录 前言1. 指代消解的基本概念与分类1.1 回指与共指 2. 指代消解的技术方法2.1 端到端指代消解2.2 高阶推理模型2.3 基于BERT的模型 3. 事件共指消解&#xff1a;跨文档的挑战与进展3.1 联合模型3.2 语义嵌入模型&#xff08;EPASE&#xff09; 4. 应用场景与前景展望4.1 关键…

Chapter4.1 Coding an LLM architecture

文章目录 4 Implementing a GPT model from Scratch To Generate Text4.1 Coding an LLM architecture 4 Implementing a GPT model from Scratch To Generate Text 本章节包含 编写一个类似于GPT的大型语言模型&#xff08;LLM&#xff09;&#xff0c;这个模型可以被训练来生…

nginx正向代理从安装到使用一网打尽系列(二)使用

一、背景 使用场景大总结&#xff0c;可作为参考手册用 nginx正向代理从安装到使用一网打尽系列&#xff08;一&#xff09;安装 nginx正向代理从安装到使用一网打尽系列&#xff08;二&#xff09;使用 二、使用场景 1、所有内网应用都不能直接访问外网&#xff0c;但需要…

论文解读 | NeurIPS'24 IRCAN:通过识别和重新加权上下文感知神经元来减轻大语言模型生成中的知识冲突...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 史丹&#xff0c;天津大学博士生 内容简介 大语言模型&#xff08;LLM&#xff09;经过海量数据训练后编码了丰富的世界知识。最近的研究表明&#xff0c…

大语言模型训练所需的最低显存,联邦大语言模型训练的传输优化技术

联邦大语言模型训练的传输优化技术 目录 联邦大语言模型训练的传输优化技术大语言模型训练所需的最低显存大语言模型训练所需的最低显存 基于模型微调、压缩和分布式并行处理的方法,介绍了相关开源模型及技术应用 核心创新点 多维度优化策略:综合运用基于模型微调、模型压缩和…

(CICD)自动化构建打包、部署(Jenkins + maven+ gitlab+tomcat)

一、平滑发布与灰度发布 **什么叫平滑&#xff1a;**在发布的过程中不影响用户的使用&#xff0c;系统不会因发布而暂停对外服务&#xff0c;不会造成用户短暂性无法访问&#xff1b; **什么叫灰度&#xff1a;**发布后让部分用户使用新版本&#xff0c;其它用户使用旧版本&am…

Python 科学计算

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

【pytorch】注意力机制-1

1 注意力提示 1.1 自主性的与非自主性的注意力提示 非自主性提示&#xff1a; 可以简单地使用参数化的全连接层&#xff0c;甚至是非参数化的最大汇聚层或平均汇聚层。 自主性提示 注意力机制与全连接层或汇聚层区别开来。在注意力机制的背景下&#xff0c;自主性提示被称为查…

Qt窗口获取Tftpd32_svc服务下载信息

前言 一个由Qt开发的Windows小工具需要布置Tftp协议服务端来支持设备下载数据&#xff0c;并显示下载列表&#xff08;进度、下载源等&#xff09;。 考虑开发方便&#xff0c;优先使用了Qtftp方案&#xff0c;经测试发现&#xff0c;不够稳定&#xff0c;会有下载超时的情况&a…

<OS 有关> DOS 批处理命令文件,用于创建 python 虚拟机,并进入虚拟机状态执行后继命令 判断虚拟机是否存在,在批处理文件中自定义 虚拟机名字

前言&#xff1a; 经常要敲重复的命令&#xff1a; python -m venv venv.\venv\Scripts\activate.bat (虽然能按 Tab 省几下&#xff0c;多了也烦恼&#xff0c;后来写了四行脚本 start.bat) DOS批处理 create_venv_start.bat 功能&#xff1a; 批处理显示支持中文在 creat…