Linux C语言(8)

news2024/11/25 7:44:00

1、指针

1.1 概念

 指针就是地址
 指针是一种数据类型,是一种保存地址的数据类型
 int是一种数据类型,是一种保存整数的数据类型 1 2 3 4
 float是一种数据类型,是一种保存浮点数的数据类型 3.14

1.2 什么是地址

 内存分配的最小单位是字节,每一个字节都有一个编号,我们把整个编号就叫做地址
 ​
 地址的本质:内存单元的编号
 ​
 指针:指针就是地址
 ​
 指针的本质:内存单元的编号

1.3 什么是指针变量

 int a;
 ​
 float b;
 ​
 指针变量:专门原来保存地址(内存单元的编号)的变量

1.4 定义

 存储类型 数据类型 *指针变量名;
 int * p;
 数据类型表示本指针变量所指向的变量的数据类型
 存储类型表示本指针变量所指向的变量的存储类型
 指针变量名是*后面的内容,*只是说明定义的是一个指针变量
 只能指向相同数据类型的变量
 int * p;
 存储类型:auto、static、extern、register
 数据类型:指针所执行的数据类型 //int
 指针数据类型(去掉指针变量名):数据类型 *  //int*  
 *在c语言中有3种用法:
 1、作为双目运算符,表示乘法 3*4
 2、在定义变量的时候使用,表示指针这种数据类型
 3、作为单目运算符,表示取值  *p(取指定变量p所存储的地址)    通过指针间接访问指针所指向的对象
 在C语言中,变量的地址是由编译系统分配的,用户不知道变量的具体位置。C语言中提供了地址运算符“&”来表示变量的地址,其一遍形式为    &变量名;   
 int i,*p;
 p = &a;

注意

 1、指针的指向是可以改变的
 2、给指针赋值时,要注意数据类型的匹配
 &是取地址运算符 *(地址)是取值运算符
 3、&和*互为逆运算,可以相互抵消,正和负的关系
 4、&为引用,*为解引用

在32OS系统中,所有的指针都占4个字节

在64OS系统中,所有的指针都占8个字节

思考

 1、什么是指针
     指针是一种数据类型,是一种保存地址的数据类型(内存单元的编号)
 2、什么是地址
     内存单元的编号
 3、什么是指针变量
     专门用来保存指针的变量
 4、如何定义一个指针变量
     存储类型 数据类型 * 指针变量名
 5、如果给指针变量赋值
     p = &a
 6、赋值之后可以做什么呢
     修改、操作变量a

2、空指针

空指针:int * p = NULL;

没有指向的指针(值为0的指针,就认为该指针没有指向)

注意:0号地址禁止操作(一旦操作会出现段错误//Segmentation fault (core dumped))非法访问内存空间。

要操作必须改变空指针的指向

3、野指针

int * p;

不知道指向哪里的指针

局部变量没有初始化的时候,其值为随机值

局部指针变量没有初始化,就成了野指针

空指针操作不会出问题,野指针操作可能会出问题(随机值)//不清楚具体指向,修改取值会报错

如何避免野指针的出现?初始化为NULL

4、gdb的调试

Linux中调试使用调试器gdb

编辑器:vim
编译器:gcc
调试器:gdb

调试步骤

(1)编译程序的时候添加 "-g"参数
gcc -g error.c -o error
(2)启动gdb调试器
gdb 可执行文件的名字 (gdb error)
(3)设置断点
b main
b 行号
(4)运行
r
(5)其它参数
n(next):下一步,不进入子函数
s(step):下一步,进入子函数
p(printf) a(要打印的值)
c(continue):可以直接跳出循环,执行下一步
q(quit):退出

5、值传递

编写一子函数,实现两个数的交换

值传递:以下类型变量作为函数参数传递,包括基本数据类型变量(例如int、char、double等)、结构体类型变量。被调函数中对形参值的修改,不影响主调函数中的实参值。

值传递:类似物体的克隆,被调函数操作克隆的物体,主调函数操作源物体。本质是形参的地址空间与实参的地址空间不同。

6、地址传递

include <stdio.h>

void swp(int * m, int * n);

int main(void)
{
        int a = 1;
        int b = 2;
        swp(&a,&b);
        printf("%d\n",a);
        printf("%d\n",b);
        return 0;
}
void swp(int * m, int * n)
{
        int tmp =0;
        tmp = *m;
        *m = *n;
        *n = tmp;
}

地址传递:以下类型变量作为函数参数传递,包括数组名、指针或地址。被调函数中对形参值的修改,会影响主调函数中的实参值。

地址传递:类似物体的移动,两个函数先后操作同一个物体。本质是形参的地址空间与实参的地址空间相同。

7、const修饰的指针

const:只读

用来修饰变量,使用const修饰的变量只能读,不能被修改(未修改存储位置,仍在栈区)

int a = 10;//存放在栈区
const int a = 10;//

判断const修饰的变量是否在常量区

const修饰的指针:

指针变量:
(1)指针常量: 指针的指向不能发生改变
int * const p = NULL;//值可改,指向不可改
(2)常量指针: 指针所指向的内容不能被修改
int const *p = NULL;//指向可改,值不可改
(3)值和指向都不能修改
const int * const p = NULL;//值和指向都不能被修改 

8、二级指针

8.1 概念

二级指针:指针的指针

二级指针的内存空间存放的是一级指针变量的地址

8.2 定义

一级指针: 存储类型 数据类型 *指针变量名;
数据类型:指针所指向的数据类型
一级指针:列指针,*一级指针:取值
二级指针:行指针,*二级指针:变为一级指针(列指针、一维数组名)
二级指针的定义:
存储类型 数据类型 **指针变量名;
二级指针的数据类型:数据类型 **
p = &a;
pp = &p;
pp = &&a;//不能对a的地址常量取地址

案例

(1).若有语句int *point, a=4;point=&a;下面均代表a的地址的一组选项是(D)
    A. a, point,*&a B. &*a, &a,*point
    C. &point, *&point, &a D. &a, &*point, point
(2).已有定义int k=2; int*ptr1,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行赋值语句的
是(B)
    A. k=*ptr1+*ptr2; B.ptr2=k;
    C.ptr1=ptr2; D. k=*ptr1*(*ptr2);

总结

1、指针指向的数据类型就是将变量名和*(一个)去掉,剩下的就是指针所指向的数据类型
    int *p; // int
    int **p; //int *
    int ***p;//int **
2、指针的数据类型就是就变量名去掉,剩下的就是数据类型
    int *p;//int *
    int **p;//int **
    int ***p;//int ***
3、*p所能访问的空间大小,有p指向的数据类型来决定
    char *p;//*p所能访问的内存空间的大小为1byte
    int *p;//*p所能访问的内存空间的大小为4byte
    int **p;//**p所能访问的空间的大小为4byte

作业

int a[5] = {0};
1-------数组的输入
2-------数组的输出
3-------求数组中的次大值
4-------排序
-1 -----exit

#include <stdio.h>
#define N 5
#include <stdlib.h>

void menu();
void input();
void output();
void sub();
void swap();
void quit();

int main(void)
{
        int fun = 0;
        int a[N] = {0};
        while(1)
        {
                menu();
                printf("请选择功能");
                scanf("%d",&fun);
                switch(fun)
                {
                        case 1:
                                input(a);
                                break;
                        case 2:
                                output(a);
                                break;
                        case 3:
                                sub(a);
                                break;
                        case 4:
                                swap(a);
                                break;
                        case -1:
                                quit();
                }
        }

        return 0;
}
void menu()
{
        printf("功能菜单\n");
        printf("1-数组的输入\n");
        printf("2-数组的输出\n");
        printf("3-求数组中的次大值\n");
        printf("4-排序\n");
        printf("-1-exit\n");
}
//输入
void input(int * a)
{
        for(int i = 0; i <N; i++)
        {
                scanf("%d",&a[i]);
        }
}
//输出
void output(int * a)
{
        for(int i = 0; i <N; i++)
        {
                printf("%d\n",a[i]);
        }
}
//次大值
void sub(int * a)
{
        int i,max,mid;
        for(i = 0;i<5;i++)
        {
                if(a[i]>max)
                {
                        mid = max;
                        max =a[i];
                }
        else if(a[i]>mid&&a[i]<max)
        {
                //另一种情况 arr[i]在两者之间*/
                mid = a[i];
                // 把arr[i]赋给mid
                }
        }
        printf("次大值:%d\n",mid);

}
//排序
void swap(int * a)
{
        int i,j,tmp = 0;
        for(i=1;i<N;i++)
        {
                for(j=0;j<N-i;j++)
                {
                        if(a[j]>a[j+1])
                        {
                                tmp=a[j];
                                a[j]=a[j+1];
                                a[j+1]=tmp;
                        }
                }
        }
}
//退出
void quit()
{
        exit(0);
}

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

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

相关文章

19、Flink 的Table API 和 SQL 中的自定义函数及示例(3)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

5分钟Python安装实战(MAC版本)

最近在学习Chatgpt接口&#xff0c;官方提供三种方式调用Chatgpt接口&#xff0c;分别是curl、python、node.js&#xff1a;具体介绍我放在下方图片 因为熟悉Python&#xff0c;所以我选择了python这种方式&#xff0c;顺便记录下安装过程&#xff0c;整体并不复杂&#xff0c;…

java正则表达式(Pattern类和Matcher类)

文章目录 前言一、Java中使用正则表达式①捕获组②Pattern类与Matcher类Pattern类&#xff1a;Matcher类&#xff1a;Pattern类&Matcher类方法:Pattern类调用方法&#xff08;静态方法&#xff09;&#xff1a;1、public static Pattern compile(String regex)2、public st…

【Java】在实体类中常用的注解校验

1、常用注解&#xff1a; 注解说明Null只能为nullNotNull(message “id不能为空”)必须不为null&#xff0c;可以为空字符串Min(value)必须为一个不小于指定值的数字Max(value)必须为一个不大于指定值的数字NotBlank(message “姓名不能为空”)验证注解的元素值不为空&#…

2000-2021年全国各省资本存量测算数据(含原始数据+测算过程+计算结果)

2000-2021年全国各省资本存量测算数据&#xff08;含原始数据测算过程计算结果&#xff09; 1、时间&#xff1a;2000-2021年&#xff08;以2000年为基期&#xff09; 2、范围&#xff1a;30个省市&#xff08;不含西藏&#xff09; 3、指标&#xff1a;固定资产形成总额、固…

python poetry的教程

Poetry Python世界中&#xff0c;Poetry是一个近年来备受瞩目的工具&#xff0c;它为开发者提供了一个灵活且强大的依赖管理解决方案。Poetry可以帮助开发者管理项目的依赖关系&#xff0c;同时提供了一系列的工具和功能&#xff0c;使开发者能够更轻松地创建和管理复杂的项目。…

申克SCHENCK动平衡机显示器维修CAB700系统控制面板

适用电枢转子的卧式平衡机&#xff0c;高测量率&#xff0c;自动测量循环&#xff0c;自动定标完整的切槽计数可选项&#xff0c;CAB700动平衡测量系统两种皮带驱动方式(上置式或下置式)适用于站立或坐姿操作的人性化工作台设计。 动平衡机申克控制器面板维修型号&#xff1a;V…

关于VUE启动内存溢出

安装node v10.14.2 后 启动公司的VUE项目 使用命令npm run dev 命令 报错&#xff1a; <--- Last few GCs --->[20940:00000244699848E0] 215872 ms: Scavenge 1690.2 (1836.4) -> 1679.6 (1836.4) MB, 5.4 / 0.7 ms (average mu 0.266, current mu 0.253) a…

【编程语言发展史】SQL的发展历史

目录 目录 SQL概述 SQL发展历史 SQL特点 SQL基本语句 SQL是结构化查询语言(Structure Query Language)的缩写&#xff0c;它是使用关系模型的数据库应用语言&#xff0c;由IBM在70年代开发出来&#xff0c;作为IBM关系数据库原型System R的原型关系语言&#xff0c;实现了…

【广州华锐互动】VR虚拟仿真技术为航测实践教学提供了哪些帮助?

在过去的几十年里&#xff0c;航空测量技术发展迅速&#xff0c;为我们提供了前所未有的地理信息获取手段。然而&#xff0c;这个领域的发展并未停止&#xff0c;最新的技术进步——虚拟现实(VR)——正在为航测实践教学开启新的篇章。 VR虚拟现实技术能够创建和体验三维虚拟环境…

Next.js 项目——从入门到入门(Eslint+Prettier)

Next.js官方文档地址 什么是 Next.js 这是一个用于生产环境的 React 框架。 Next.js 为您提供生产环境所需的所有功能以及最佳的开发体验&#xff1a;包括静态及服务器端融合渲染、 支持 TypeScript、智能化打包、 路由预取等功能&#xff0c;无需任何配置。 功能&#xff…

如何下载PDF版本的专利

问题描述&#xff1a;有时下载的专利是CAJ格式&#xff0c;需要用CAJViewer软件才能观看&#xff0c;那么如何下载pdf版本的呢&#xff1f; 问题解决&#xff1a; 方法一&#xff1a; 使用CAJViewer软件进行转换。&#xff08;注意&#xff1a;这种方法转换的PDF其实就是一个…

重磅发布 OpenAI 推出用户自定义版 ChatGPT

文章目录 重磅发布 OpenAI 推出用户自定义版 ChatGPT个人简介 重磅发布 OpenAI 推出用户自定义版 ChatGPT OpenAI 首届开发者大会 (OpenAI DevDay) 于北京时间 11 月 7 日凌晨 02:00 开始&#xff0c;大会上宣布了一系列平台更新。其中一个重要更新是用户可以创建他们自己的自定…

Python 批量修改文件中的时间属性

目录 前言&#xff1a; 探索&#xff1a; 读取文件的属性时间 更改文件属性时间 使用 win32file 修改时间属性 all code: 前言&#xff1a; 有时候需要修改文件的“修改时间” 、 “访问时间”&#xff0c;“创建时间” 使用 Python 写出来简单好用。 探索&#xff1a; …

Power Apps-获取用户信息

插入一个文本组件&#xff0c;点击该组件&#xff0c;点击右侧边栏中的文本&#xff0c;在上方函数中写入如下内容就可以获取到用户信息了 "Hello!"&User().FullName//字符串拼接

中文编程软件视频推荐,自学编程电脑推荐,中文编程开发语言工具下载

中文编程软件视频推荐&#xff0c;自学编程电脑推荐&#xff0c;中文编程开发语言工具下载 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件…

IPv6详解

目录: 第一部分 IPv6的诞生背景和引起的主要变化 第二部分 IPv6数据报的基本首部和扩展首部 第三部分 IPv6地址 第四部分 IPv4向IPv6过渡 第一部分 IPv6的诞生背景和引起的主要变化 一.IPv6的诞生背景 IPv4存在设计缺陷: IPv4的设计者最初并没有想到该协议会在全球范围内广…

leetcode做题笔记226. 翻转二叉树

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]示例 3&#x…

8086读取键盘-磁盘输入

文章目录 前言1.从键盘读数据2.磁盘读数据 前言 想过一个问题没有&#xff0c; 8086是如何从键盘中接受输入的&#xff1f; 8086如何将字符在显示器上显示的&#xff1f; 8086如何从磁盘中读取数据的&#xff1f; 上面的问题都是没有操作系统的时候&#xff0c;比如bios的那段…

VSCode使用插件Github Copilot进行AI编程

演示示例 函数封装 根据上下文 根据注释 详情请看GitHub Copilot 安装插件 在VS Code中安装插件 GitHub Copilot 登录账号 点击VS code左下角账户图标&#xff0c;点击【Sign in】&#xff0c;会自动在浏览器打开Github登录页&#xff0c;登录具有 Github Copilot 服务的…