C语言指针重学

news2024/11/24 1:43:40

学习要纲:建议掌握
gdb调试(b ,d ,fin ,bt ,print ,awatch ,up ,down ,set pretty等)
SourceInsight软件看代码(全局搜索 文件搜索等)
git如何调取分支合并(git branch,git blame,git log,git pull,git reset --hard等)
等内容,下面是对于指针的一个重新学习.
C语言的指针:

  • 使得程序简单、紧凑、高效
  • 有效地表示复杂数据结构
  • 动态分配内存
  • 得到多于一个的函数返回值

1.指针的基本用法

A.地址和变量:在计算机的内存中,每一个字节单元,都有一个编号,称为地址。

在C语言之中,内存单元的地址称为指针,专门用来存放地址的变量称为指针变量

1byte = 8 bits

<存储类型> <数据类型> * <指针变量名> = <地址量>;

使用*取出相应的值,*p / *(&a)

B.指针的赋值运算值的是通过赋值运算符指向地址变量送一个地址值

注意:一般在Centos之中指针的大小都为四个字节

0x 00 00 00 00 - 0x FF FF FF FF :四个字节 2^(4*8)-1

2.指针的运算

指针运算是指以指针变量所存放的地址量作为运算量而进行的运算

p + n:指针向着大地址方向进行移动,表示p + sizeof(p 的类型) * n,为地址量
px -py:指数据的个数

3.指针与数组

4.指针与二维数组

5.指针与字符串

A.字符指针

B.注意点
初始化字符指针是把内存中字符串的首地址赋予指针,而不是把该字符串复制到指针中

char str[] = "Hello World";
char *p = str;
char ch1[] = "Hello World";
char ch2[] = "Hello World";

注意:ch1和ch2虽然是内容相同的,但是地址是不同的.
c.在C编程过程中,当一个字符指针指向一个字符串常量时,不能够修改指针指向的对象的值

char *p = "Hello World";
char *p = 'H';//错误,字符指针常量是不允许改变的

这个地方是一个易错点:

可以见到字符串常量的地址是相同的,且输出字符指针的方式是直接打印其值.

给出一个错误案例:

想要把第一个字母变成小写,会出现Segmentation fault报错,说明内存访问过程出现了问题.

6.二级指针

A.

B.

C.稍微进阶版---此处需要结合指针与字符串进行学习
 

#include <stdio.h>

int main()
{
	char *s[] = { "apple", "pear", "potato" };
	char ** p;
	int i, n;

	i = 0;
	n = sizeof(s) / sizeof(char *);
	p = &s[0];

	while (i < n)
	{
		printf("%s %s\n",s[i],*(p+i));
		i++;
	}

	getchar();
	return 0;

}

7.void指针和const修饰符

void指针是一种不确定数据类型的指针变量,在没有进行强制类型转换之前,不能进行任何指针的算数运算.
A.一般形式:void *<指针变量名称>

可以见到*p 和 *q是非法间接寻址,因为不知道如何取类型的地址大小.
当将* p变为* (int *)p即可

注意:void指针在进行使用的时候必须要进行强制转换.

B.对于void指针在没有进行强制类型转换之前是不能够进行任何的算数运算


 

C.const变量

常量化变量值
const <数据类型> 变量名 = [<表达式>];

常量化变量是死了使得变量的值不被修改,变量有const修饰时,想要用指针间接访问变量,指针也要有const修饰.

①const int *p ------ 

不能够通过指针改变目标值.

② int * const p ------ 

只能够将上面的赋值过程变为int const *q = &m,也就是q的地址不能够修改

也就是const修饰谁,谁可以不可以修改

③const int * const r = &m;
任何值都不能更改

D.main函数是否可以带参数,涉及到const指针

int main(int argc,const char * argc[])注意这个地方是针对于在Centos系统下想起来一个命令
gcc -std=c++11 ys.cpp -o a
注意:这个地方的
int argc = 1
const char * argc[] = {"./a","192.168.6.118"}

8.函数参数的用法

A.函数之间参数的传递
①全局变量传递参数

形参的地址不一样

②复制传递

调用函数将实参传递给被调用函数,被调用函数将创建同类型的形参并用实参进行初始化.

形参是新开辟的存储空间,在函数中改变形参的值,不会影响到实参.

③地址传递
按照地址进行传递,实参为变量的地址,形参是同类型的指针;
被调用函数中对形参的操作,将直接改变实参的值(被调用函数对指针目标的操作相当于对实参本身的操作)

编写一个函数,统计字符串中小写字母的个数,并把字符串中的小写字母转化成大写字母
a.统计字符串中小写字母的个数

注意:当然这个功能是非常容易进行实现的,需要进行注意的是这个地方的形参为什么是定义的为const char *p,这样定义的话就是不会改变其*p的内容,和前面的内容进行了串联.

b.将小写字母转换为大写字母

这个地方需要进行注意空格的ascll为32.

B.数组传递参数

三种方式:

①全局数组传递方式

②复制传递方式
例题:编写函数,计算一个一维整型数组的所有元素的和
实参为数组的指针,形参为数组名(本质是一个指针变量)

对于上面那句话的解读是,比如说一个形参 int p[],相当于int *p

③地址传递方式
实参为数组的指针,,形参为同类型的指针
例题:去掉字符串里面的空格

9.指针函数

A.指针函数是指一个函数的返回值为地址量的函数

指针函数的定义一般形式如下:

<数据类型> * <函数名称>(<参数说明>)
{

}

举个例子:请你说出下面代码的问题

这个地方的str[20]是局部变量,是在栈上的,返回不了了
结果是乱码了,如下所示:

原因是在于:之前租的房子,现在进不去了,所以打印出来的是乱码看不见.

改进方式: 
①将其变为全局变量 char str[20] 改法看起来怪怪的
②改变为静态变量     static char str[20] ------ 可用
③变成全局字符串常量 char * str = "Hello"; 不能够进行修改
④使用malloc的方式

B.
 

#include <stdio.h>

// 定义一个返回int类型指针的函数
int* find_max(int* a, int* b) {
    return (*a > *b) ? a : b;
}

int main() {
    int x = 10, y = 20;
    
    // 调用指针函数find_max,返回x和y中较大的那个数的地址
    int* max_ptr = find_max(&x, &y);
    
    printf("The max value is: %d\n", *max_ptr);
    
    return 0;
}

10.函数指针

函数指针用来存放函数的地址,这个地址是一个函数的入口地址
函数名代表了函数的入口地址
函数指针变量说明的一般形式如下:
<数据类型> (*<函数指针名称>) (<参数说明列表>);

#include <stdio.h>

// 定义一个返回int类型,接受两个int参数的函数
int add(int a, int b) {
	return a + b;
}

int main() {
	// 声明一个函数指针,指向接受两个int参数并返回int类型的函数
	int(*func_ptr)(int, int);

	// 将函数指针指向add函数
	func_ptr = add;

	// 通过函数指针调用add函数
	printf("The result is: %d\n", (*func_ptr)(3, 4));
	getchar();
	return 0;
}

函数指针的声明方式是先声明返回类型,然后是函数指针变量名,再跟随函数的参数类型。

这个地方可以结合指针数组一起使用,相应的指针数组如下所示:

#include <iostream>
using namespace std;

int main() {
    // 定义一个指针数组,能够存储5个int类型的指针
    int* ptrArray[5];
    
    // 定义一些整数
    int a = 10, b = 20, c = 30, d = 40, e = 50;
    
    // 将每个整数的地址赋值给指针数组中的元素
    ptrArray[0] = &a;
    ptrArray[1] = &b;
    ptrArray[2] = &c;
    ptrArray[3] = &d;
    ptrArray[4] = &e;
    
    // 通过指针数组输出各个整数的值
    for (int i = 0; i < 5; i++) {
        cout << "Value of ptrArray[" << i << "]: " << *ptrArray[i] << endl;
    }

    return 0;
}

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

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

相关文章

如何使用ssm实现基于java web的计算机office课程平台设计与实现+vue

TOC ssm277基于java web的计算机office课程平台设计与实现vue 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利…

WireShark网络分析~部署方式

一、《Wireshark网络分析就这么简单》 第一章学习 声明&#xff1a;文章只限于网络学习和实验&#xff0c;请遵守《网络安全法》。 第一章问题一&#xff1a;两台服务器A和B的网络配置如下(见图1)&#xff0c;B的子网掩码本应该是255.255.255.0&#xff0c;被不小心配成了255.…

LeetCode 热题100-37 二叉树的最大深度

二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;ro…

py 可视化图层

五张图&#xff1a;数据资源可联系1493175691qq.com import numpy as np import matplotlib.pyplot as plt from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter import cartopy.crs as ccrs import cartopy.feature as cfeature from cartopy.io.shaperead…

长亭雷池 WAF 部署及使用过程中遇到的问题

1、安装过程中遇到的问题 这里推荐使用官方的脚本命令&#xff0c;大概看了一下是先判断是否有容器&#xff0c;如果没有容器环境就安装&#xff0c;但是这一步就报错了。这里需要更换成阿里云或是国内其它的源来安装。 bash -c "$(curl -fsSLk https://waf-ce.chaitin.…

黑神话悟空丨资源合集,光追配置+修改器+各种奇奇怪怪的MOD

国产3A大作 黑神话悟空 推出了一些奇奇怪怪的mod(非官方)&#xff0c;作为一款备受瞩目的单机作品&#xff0c;黑神话悟空 不仅在剧情和画面上表现出色&#xff0c;同时也为玩家提供了丰富的Mod支持。 哈哈哈哈&#xff0c;总是就是奇奇怪怪&#xff0c;悟空被玩坏了&#xff…

unicode编码存在转义字符,导致乱码问题的解决方案

【前言】   本篇是为了记录一次解码出现乱码的解决方案&#xff0c;篇幅较短&#xff0c;废话不多说&#xff0c;请食用 【问题】后端针对一个字符串进行unicode编码后的&#xff0c;前端解码后出现乱码问题 unicode编码后的字符串&#xff0c;直接交给前端解码&#xff0c;…

【搜索引擎】ElasticSearch 8.x版本

1 ElasticSearch 8.x概述 1.1 Elasticsearch 8.X 来了 1.2 Elasticsearch 新特性 1.3 Elasticsearch 课程升级 2 ElasticSearch 安装 & 使用 2.1 Java 17 安装 2.1.1 下载软件 2.1.2 软件升级 2.2 Elasticsearch 安装 & 使用 2.2.1 下载软件 2.2.2 安装软件 2.2.3…

Visio po解版的详细介绍

一、Visio简介 Visio是一款流程图、组织结构图、地平图、工程图等各类专业图表的制作软件。自问世以来&#xff0c;凭借其友好的用户界面、丰富的图形库和强大的编辑功能&#xff0c;已成为行业内使用最广泛的图形设计软件之一。无论是初学者还是专业人士&#xff0c;都能在Vi…

首发!《物流运输行业电子签最佳实践案例集》重磅发布

近日&#xff0c;法大大重磅发布《物流运输行业电子签最佳实践案例集》&#xff0c;旨在分享在物流行业深耕近10年的经验&#xff0c;为物流企业提供基于电子签技术的数字化创新参考。 该案例集精选中原大易、G7易流、河北快运、万联易达、浙江新颜物流、内蒙古多蒙德、天津小…

使用C++封装顺序表

作业&#xff1a;使用C手动封装一个顺序表&#xff0c;包含成员数组一个&#xff0c;成员变量N个 #include <iostream>using namespace std;using datatypeint; #define MAX 20struct SeqList { private: //私有datatype *data;int size0; …

【Node】【7】函数

函数可以作为变量传递 function execute(someFunction, value) {someFunction(value); }execute(function(word){ console.log(word) }, "Hello");函数传递让http服务器工作,向createServer 传递了一个回调函数&#xff0c;该回调函数会在每次接收到 HTTP 请求时被调…

由浅入深学习 C 语言:Hello World【基础篇】

目录 1. 第一个 C 语言程序 2. 源文件 3. 编译程序 3.1 为什么要编译程序 3.2 C 程序编译过程 4. 预处理器指令 5. 头文件 5.1 什么是头文件 5.2 如何使用头文件 6. 注释 7. main 函数 7.1 函数格式 7.2 main 函数特性 8. 语句 9. return 语句 1. 第一个 C 语言程…

Qt QCustomPlot画色阶图

工作中用到QCustomPlot画曲线图和色阶图&#xff0c;并且在色阶图上添加文字&#xff0c;圆圈或者几条线段画一些图形&#xff0c;这里写个简单的例子把这几个功能记录一下&#xff0c;代码在这里&#xff1a; https://download.csdn.net/download/Sakuya__/89681279https://…

ARP(地址解析协议)详解

1. 引言 在计算机网络中&#xff0c;数据链路层使用MAC地址来传输数据&#xff0c;而网络层使用IP地址来标识设备。当一个设备需要发送数据给另一个设备时&#xff0c;它只知道目标设备的IP地址&#xff0c;而不知道其对应的MAC地址。此时&#xff0c;地址解析协议&#xff08;…

MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM的区别与联系

你是否与我一样&#xff0c;也曾有过类似的疑惑&#xff1a; 企业数字化转型过程中可能会用到哪些系统&#xff1f;其中&#xff0c;又是在哪些情况下才会用到这些系统&#xff1f; 有了这些疑问&#xff0c;你肯定想知道答案。 为了解决你的心头之患&#xff0c;我花了整整…

Linux C创建进程及父子进程虚拟地址空间(附源码)

1.Linux创建进程 Linux允许一个进程创建新进程&#xff0c;新进程即为子进程&#xff0c;子进程还可以创建新的子进程&#xff0c;形成进程树型结构模型。 #include <sys/types.h> #include <unistd.h> pid_t fork(void); 返回值&#xff1a;成功&#xff1a;子进…

npm包下载慢的解决方案(手把手教你跟换yarn和pnpm设置镜像源)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 一、npm镜像源二、更换镜像源的步骤1、查看当前镜像源2、改成淘宝镜像源3、删除镜像&#xff0c;恢复默认镜像 三、以…

图森未来创始人之争后续:一场新的争夺战又拉开序幕?

自动驾驶明星公司图森未来&#xff0c;此前陷入一场权力斗争风波。 如今&#xff0c;重掌控制权的创始人陈默和CEO吕程主导下&#xff0c;近期宣布进入生成式AI应用领域&#xff1b;另一个负气出走的创始人侯晓迪&#xff0c;则带着L4级别自动驾驶的理想开始新的创业。 曾经的…

Maven学习(零基础到面试)

1.什么是Maven? maven是一款用于管理和构建java项目的工具 2.Maven的作用&#xff1f; 1.依赖管理&#xff1a;方便快捷的管理项目以来的资源&#xff08;jar包&#xff09;&#xff0c;避免版本冲突问题。 以前的项目需要创建lib包&#xff0c;将网上的jar包资源放入其中使用…