C基础(学习)2024.7.24

   Linux基本命令,vi编译器的使用,简单的编程步骤,程序语言,gcc编译器编译过程,进制转换相关知识可以查看文档http://t.csdnimg.cn/CmqhC

        数值表示,词法符号,变量,常量相关知识可以查看文档http://t.csdnimg.cn/jJIe2

        运算符和输表达式,输入输出相关知识可以查看文档http://t.csdnimg.cn/FJe89

        控制语句,if-else,switch-case,for,while,do-while,循环控制语句相关知识可以产看文档http://t.csdnimg.cn/zskY3

        一维数组,字符数组相关知识可以查看文档http://t.csdnimg.cn/1weqY

        排序(冒泡排序和选择排序),二维数组相关知识可以查看文档http://t.csdnimg.cn/hvo5C

        指针相关知识(概念,格式,初始化,指针运算)可以查看文档http://t.csdnimg.cn/8lop0

目录

指针修饰

1.const常量化

(1)修饰普通变量

         修饰局部变量

         修饰全局变量

(2)修饰指针指向的内容

(3)修饰指针的指向

2.void

3. 大小端

二级指针

格式

指针和数组

1.两种访问方式

2. 指针和一维数组

(1)用法

通过数组名直接访问

通过指针间接访问

(2)++和*的运算方法

3.指针和二维数组

数组指针

1.定义

2.格式

3. 大小

指针数组

1.定义

2.定义格式

3.应用

(1)用于存放普通变量的地址

(2)用于存放二维数组中每行第一列的地址 (列地址)

(3)用于存放字符串

(4)命令行参数

指针补充知识:

指针修饰

1.const常量化

注意:const定义变量时必须在定义的时候就给它赋初值。

(1)修饰普通变量

         修饰局部变量

                        const int a=10;        //int const a=10; 

                        此时a只读,不可以修改。但是可以通过指针修改。

                        int *p=&a;

                       *p=20; //可以用指针间接修改,会报警告。

         修饰全局变量

                 放在常量区,不能通过指针修改,会报段错误

(2)修饰指针指向的内容

        修饰*p,指针指向的内容不能修改,但是指针的指向可以修改。

        const int *p;        //int const *p;

                        int a = 10, b = 20;
                        int const *p = &a;
                        *p = 20;//错误,因为*p被const修饰不更更改。
                         p=&b;  //可以通过修改指针指向

(3)修饰指针的指向

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

                        int a = 10, b = 2;
                        int *const p = &a;
                        p = &b; //错误,因为p被const修饰不能被修改。
                        *p=20; //可以修改指针指向内容也就是*p

2.void

        (1)不允许修饰普通变量: void a;  //错误!!

        (2)可以修饰指针: void *p;  //此时p是一个任意类型的指针

使用场景:函数传参或函数返回值。例如malloc函数的返回值。

注意: 通过void型指针进行取内容时,需要对地址进行强转。

int a = 10;

void *p = &a;           //p数据类型为void *

int *q = (int *)p;      //将p转换成int *类型的指针然后赋值给q

printf("%d %d\n", *(int *)p, *q);  //10 10              

3. 大小端

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

        大端:数据的低位存储在高地址位,数据的高位存储在低地址位,大端字节序称为MSB

        小端:据的低位存储在低地址位,数据的高位存储在高地址位,小端字节序称为LSB

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

地址:0x4000        0x4001         0x4002         0x4003

小端:0x78            0x56             0x34             0x12

大端:0x12            0x34             0x56             0x78

        注意:强制转换不会改变变量本身的数据类型,而是拿到转换后的结果做应用

二级指针

        一级指针:存放普通变量的地址

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

格式

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

int a=10;

int *p=&a;

int **q=&p;

p指向了a, q指向了p也就是等于p的地址。

访问a的值,a的地址:

a的值            a的地址            p的地址

   a                     &a                    &p

  *p                      p                       q

  **q                    *q    

指针和数组

1.两种访问方式

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

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

2. 指针和一维数组

(1)用法

        int a[5] ={1,2,3,4,5};  //a数组的首地址

        int *p=a;

通过数组名直接访问

元素:a[i] 和 *(a+i)

地址:&a[i] 和 a+i 

通过指针间接访问

元素:p[i] 和 *(p+i)

地址:&p[i] 和 p+i

注意:a和p数值上一样,但是本质不同。

           (1)a是地址常量,p是指针变量。

           (2)a不能执行++操作,但是p可以。

(2)++和*的运算方法

        (1)++和*是单目运算符

        (2)单目运算符从右向左运算

        (3)++在在前先++再取值,++在后先取值再加加。

        (4)++结合内容则内容加加,++结合的是指针那么则指针加加

3.指针和二维数组

二维数组数组名表示

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

        a是数组名,表示第一行的地址,a+1表示第二行的地址。

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

*a: 表示第一行第一列的地址

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

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

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

元素:

a[i][j]

*(*(a+i)+j)

*(a[i]+j)

地址:

&a[i][j]

*(a+i)+j

a[i]+j

数组指针

1.定义

本质还是指针,指向的是数组。 (又称行指针)

2.格式

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

int a[2][3] = {1,2,3,4,5,6};
int (*p)[3] = a;   
p的类型也是 int (*)[3], 运算要3个3个运算
p可以代替a进行元素访问,但是本质不同,p是指针变量,a是地址常量。

访问地址:

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

访问元素:

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

3. 大小

sizeof(p) = 8

因为本质还是指针,所以大小都是8字节。如果32位系统是4字节

指针数组

1.定义

所谓指针数组是指由若干个具有相同存储类型和数据类型的指针变量构成的集合
其本质是数组,里面存放的是指针

2.定义格式

存储类型 数据类型 *数组名[元素个数];                int *a[2];

指针数组名还是表示该数组的首地址

3.应用

(1)用于存放普通变量的地址

int a=10,b=20,c=30;
int *p[3] = {&a,&b,&c};

访问元素:
*p[i]
**(p+i)

访问地址:
p[i]
*(p+i)

(2)用于存放二维数组中每行第一列的地址 (列地址)

int a[2][3] ={1,2,3,4,5,6};
int *p[2] = {a[0], a[1]};  //或者*a, *(a+1)

访问地址:
&p[i][j]
p[i]+j   
*(p+i)+j 

访问元素:
p[i][j]
*(p[i]+j)
*(*(p+i)+j)

(3)用于存放字符串

char *p[3] = {"hello", "world","666"}; 
打印字符还是这三个公式:*(p[i]+j)  *(*(p+i)+j)  p[i][j]

(4)命令行参数

int main(int argc, char const *argv[])
{
        printf("%s\n",argv[0]);
}

argv:就是一个指针数组,里面存放的是命令行传递的字符串

argc:表示argv指针数组里面存储数据的个数,即命令行传递字符串的个数

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

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

相关文章

数据结构初阶(C语言)-二叉树

一,树的概念与结构 树是⼀种非线性的数据结构,它是由 n(n>0) 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,而叶朝下的。 1.有⼀个特殊的结点&a…

【Linux学习 | 第1篇】Linux介绍+安装

文章目录 Linux1. Linux简介1.1 不同操作系统1.2 Linux系统版本 2. Linux安装2.1 安装方式2.2 网卡设置2.3 安装SSH连接工具2.4 Linux和Windows目录结构对比 Linux 1. Linux简介 1.1 不同操作系统 桌面操作系统 Windows (用户数量最多)MacOS ( 操作体验好,办公人…

昇思25天学习打卡营第22天|基于MindNLP+MusicGen生成自己的个性化音乐

文章目录 昇思MindSpore应用实践1、MusicGen模型简介残差矢量量化(RVQ)SoundStreamEncodec 2、生成音乐无提示生成文本提示生成音频提示生成 Reference 昇思MindSpore应用实践 本系列文章主要用于记录昇思25天学习打卡营的学习心得。 1、MusicGen模型简…

python使用 tkinter 生成随机颜色

先看效果: 只要不停点击底部的按钮,每次都会生成新的颜色。炫酷啊。 import random import tkinter import tkinter.messagebox from tkinter import Button# todo """ 1. 设置一个按钮,来让用户选择是否显示颜色值 2. 把按钮换成 Label…

谷粒商城实战笔记-错误记录-启动失败

文章目录 一,lombok报错二,Output directory is not specified 一,lombok报错 java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy8 Lombok …

MATLAB的基础知识

matlab的基本小常识 1. 在每行语句后面加上英文分号表示不在命令行窗口显示运行结果。 a 3; a 5 2. 多行注释快捷键,CTRLR。 3. 取消多行注释,CTRLT。 4. 清空工作区的所有变量使用clear。 5. 清空命令行窗口的所有变量使用clc。 6. clc和clear一起使…

初试Ollama本地大模型

准备工作 机器配置: CPUi5-10400内存16GB硬盘SSD 480GB显卡GTX 1660 系统:Ubuntu 18.04 Server NVIDIA驱动安装 - 下载 驱动下载地址:https://www.nvidia.cn/geforce/drivers/ - 获取下载链接 GTX 1660驱动下载链接:https://…

怎么理解FPGA的查找表与CPLD的乘积项

怎么理解 fpga的查找表 与cpld的乘积项 FPGA(现场可编程门阵列)和CPLD(复杂可编程逻辑器件)是两种常见的数字逻辑器件,它们在内部架构和工作原理上有着一些显著的区别。理解FPGA的查找表(LUT,L…

Git如何将一个分支上的修改转移到另一个分支

在我们使用git进行版本控制时,当代码写错分支,怎么将这些修改转移到正确的分支上去呢?这时,我们可以使用git stath命令来暂存我们的修改,然后再切换到其他分支 未commit(提交)操作时 1. 先将修…

在 Android 上实现语音命令识别:详细指南

在 Android 上实现语音命令识别:详细指南 语音命令识别在现代 Android 应用中变得越来越普遍。它允许用户通过自然语言与设备进行交互,从而提升用户体验。本文将详细介绍如何在 Android 上实现语音命令识别,包括基本实现、带有占位槽位的命令处理,以及相关的配置和调试步骤…

力扣SQL50 指定日期的产品价格 双重子查询 coalesce

Problem: 1164. 指定日期的产品价格 coalesce 的使用 简洁版 &#x1f468;‍&#x1f3eb; 参考题解 select distinct p1.product_id,coalesce((select p2.new_pricefrom Products p2where p2.product_id p1.product_id and p2.change_date < 2019-08-16order by p2.…

【github项目】Algorithms-for-Automated-Driving自动驾驶算法(1)

本文解决项目中“Basics of Image Formation”部分的问题&#xff0c;也就是实现从世界坐标向像素坐标的转换。 文件位置&#xff1a;Algorithms-for-Automated-Driving-master \code\exercises\lane_detection\camera_geometry.py 代码中写了详细注释。 import numpy as np…

黑马JavaWeb企业级开发(知识清单)03——HTML实现正文:排版(音视频、换行、段落)、布局标签(div、span)、盒子模型

文章目录 前言一、正文排版1. 视频标签: < video >2. 音频标签: < audio >3. 换行标签: < br >4. 段落标签 < p >5. vscode实现 二、布局1. 盒子模型2. 布局标签< div >和< span >3. VScode实现 三、源代码和运行结果总结 前言 本篇文章是…

uniapp bug解决:uniapp文件查找失败:‘uview-ui‘ at main.js:14

文章目录 报错内容解决方法main.js 文件中 uView 主 JS 库引入 uView 的全局 SCSS 主题文件内容修改引入 uView 基础样式内容修改配置 easycom 内容修改 报错内容 10:50:51.795 文件查找失败&#xff1a;uview-ui at main.js:14 10:59:39.570 正在差量编译... 10:59:43.213 文…

什么是etcd?及 etcd的核心特点

什么是etcd?及 etcd的核心特点 1、etcd简介2、etcd的核心特点1. 简单易用2. 安全可靠3. 性能卓越4. 分布式架构3、etcd的应用💖The Begin💖点点关注,收藏不迷路💖 1、etcd简介 etcd是一个由CoreOS团队发起的开源项目,它是一个高可用的分布式键值存储系统,使用Go语言…

git的一些使用技巧(git fetch 和 git pull的区别,git merge 和 git rebase的区别)

最近闲来无聊&#xff0c;虽然会使用git操作&#xff0c;但是 git fetch 和 git pull 的区别&#xff0c;git merge 和 git rebase的区别只是一知半解&#xff0c;稍微研究一下&#xff1b; git fetch 和 git pull 的区别 git fetch git fetch 是将远程仓库中的改动拉到本地…

ARM架构(三)——AMBA和总线②

本文参考 ARM文档“Introduction to AMBA AXI4 - Arm Developer” 手册可以在ARM官方文档中下载ARM.con&#xff0c;也可以访问我的百度网盘资源 提取码&#xff1a;1234 目录 1. AXI协议概述1.1 多主系统中的AXI1.2 AXI通道1.3 AXI的主要特点 2. 通道传输和事务&#xff08; …

基础IO(重定向与缓冲区)

一、重定向 1、stat() 与 read() 函数 &#xff08;1&#xff09;stat() 函数 path&#xff1a;文件路径 buf&#xff1a;输出型参数&#xff0c;用于返回文件的各种属性。 函数成功返回 0 &#xff0c;失败返回 -1 &#xff08;2&#xff09;read() 函数 fd&#xff1a;文…

使用minio cllient(mc)完成不同服务器的minio的数据迁移和mc基本操作

minio client 前言使用1.拉取minio client 镜像2.部署mc容器3.添加云存储服务器4.迁移数据1.全量迁移2.只迁移某个桶3.覆盖重名文件 5.其他操作1.列出所有alias、列出列出桶中的文件和目录1.1.列出所有alias1.2.列出桶中的文件和目录 2.创建桶、删除桶2.1.创建桶2.2.删除桶 3.删…

Android APK混淆处理方案分析

这里写目录标题 一、前言1.1 相关工具二、Apk 分析2.1 apk 解压文件2.2 apk 签名信息2.3 apk AndroidManifest.xml2.4 apk code三、Apk 处理3.1 添加垃圾文件3.2 AndroidManifest.xml 处理3.3 dex 混淆处理3.4 zipalign对齐3.5 apk 重新签名3.6 apk 安装测试四、总结一、前言 提…