C指针之初始化(三)

2023-10-27

一、引言

C/C++语言中引入了指针,使得程序能够直接访问内存地址,使得很多复杂的操作变得简单,同时也提高了程序的运行效率。指针即是地址,但是地址却是通过指针变量来存储的。因此我们通常所说的指针在很多时候说的都是指针变量。指针变量在使用之前必须被初始化,否则就可能发生意想不到的错误。而且关于指针初始化,不同的编译器给出的告警是不一样的,有些系统给出告警,而有些系统又不给。因此,指针虽然,但使用要谨慎。而且要是使用了动态分配空间的模式为指针做初始化,则使用结束后还需要手工释放空间,以节约内存空间。本文以C语言为主介绍了常见的指针变量初始化方法。

二、指针变量初始化范例

1.指向某个变量的地址
示例代码:

#include"stdio.h"  
int main()
{
	int a = 1;
	int *p = &a;//指针变量初始化 
	printf( " 存储变量a的地址:%x\n", &a );
	printf( " 指针变量p存储的地址:%x\n", p );
	printf( " 指针变量p指向地址中的数据:%5d\n", *p );
	return 0;
}

运行结果:
在这里插入图片描述
2.动态分配空间
通常用于动态数组,C语言使用malloc进行动态分配空间,C++使用new分配空间。动态数组使用结束需要释放空间,使用free或者delete进行释放。
示例代码:

#include"stdio.h" 
#include"malloc.h"
int main()
{
	int i, num, sum, count;
	int *arr;
	count = 0;
	while( 1 )
	{
		sum = 0;
		num = 0;
		printf( "数组元素的个数(0 结束):" );
		scanf( "%d", &num );
		if( num == 0 )
		{
			printf( "结束运行!\n" );
			break;
		}
		count++;
		arr = ( int * )malloc( num * sizeof( int ) );//动态分配空间
		for( i=0; i<num; i++ )
		{
			printf( "输入第 %d 个元素:", i+1 );
			scanf( "%d", &arr[i] );
			sum += arr[i];
		}
		printf( "第 %d 组元素之和:%5d\n", count, sum );
	}
	free( arr );//释放由malloc分配的空间 
	return 0;
}

上述代码是C语言,如果使用C++语言,则是如下代码:

#include"iostream" 
using namespace std;
int main()
{
	int i, num, sum, count;
	int *arr;
	count = 0;
	while( 1 )
	{
		sum = 0;
		num = 0;
		cout<< "数组元素的个数(0 结束):";
		cin>>num;
		if( num == 0 )
		{
			cout<<"结束运行!"<<endl;
			break;
		}
		count++;
		arr = new int[num];//使用new分配空间
		for( i=0; i<num; i++ )
		{
			cout<<"输入第 " <<(i+1) << " 个元素:";
			cin>>arr[i];
			sum += arr[i];
		}
		cout<<"第 " << count <<" 组元素之和:" <<  sum << endl;
	}
	delete[] arr;//释放由new分配的空间 
	return 0;
}

运行结果:
在这里插入图片描述
3.指向某个数组的首地址
通常用于快速对数组元素做相应的操作,例如利用指针变量p++模式对数组赋值或者读取元素,其读取内存速度快。
示例代码:

#include"stdio.h" 
#define N 10
int main()
{
	int i, arr[N], *p;
	p = arr; //p = &arr[0]; //指针变量p指向数组的首地址,此处有两种不同的赋值方法
	i = 1;
	while( i <= N )
	{
		printf( "输入第 %d 个元素: ", i );
		scanf( "%d", p++ );
		i++;
	}
	printf( "数组arr中的元素:" );
	for( i=0; i<N; i++ )
	{
		printf( "%5d", arr[i] );
	}
	return 0;
}

运行结果:
在这里插入图片描述
4.指向字符串变量或字符串常量
通常用于快速对字符串做相应的操作。
示例代码:

#include"stdio.h"
#include"string.h"
int main()
{
	char *pc;                    
	//pc = "c language";//如此初始化指针会发生告警
	char str[] = "C/C++ Programming language";
	pc = str; 
	printf( "%s\n", pc ); 
	pc = pc + 2;           
	printf( "%s\n", pc ); 
	char *p = strstr( pc, "lan" );//找到 "lan"在pc中位置地址,赋值为指针变量p 
	printf( "%s\n", p );
	return 0;
}

运行结果:
在这里插入图片描述
5.利用其它指针做初始化
通常用于缓存某一地址。
示例代码:

#include"stdio.h"
#include"malloc.h"
int main()
{
	int i, *p, *q;
	int num = 5;
	p = ( int * )malloc( num * sizeof(int) );//动态分配空间
	q = p;//q指向p的地址,这样当q的位置发生改变时,p的首地址不变
	i = 1;
	while( i <= num )
	{
		printf( "输入第 %d 个元素: ", i );
		scanf( "%d", q++ );//利用指针变量q偏移来对动态数组p赋值
		i++;
	}
	printf( "数组arr中的元素:" );
	for( i=0; i<num; i++ )
	{
		printf( "%5d", p[i] );
	}
	return 0;
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C指针之初始化(三) 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 按成员序列化

    我已经实现了template
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 低级处理函数ProcessFunction

    原文链接 https zhuanlan zhihu com p 130708277 1 ProcessFunction定义 ProcessFunction 函数是低阶流处理算子 可以访问流应用程序所有 非循环 基本构建块 事件 数据流元素
  • 栈的应用-综合计数器的实现

    目录 前言 一 思路分析 二 代码实现 总结 前言 在实现综合计数器之前 大家应该先了解一下什么是前中后缀表达式 前缀 中缀和后缀表达式是表示数学表达式的三种不同方式 前缀表达式 也称为波兰式或前缀记法 操作符位于操作数之前 例如 2 3
  • 5款智能编程助手,让你代码写的飞起

    之前写过一篇文章介绍AI编码 代码不熟没关系 让AI替你写 今天再来回顾一下 我再更新下列表 除了常见的大模型之外 ChatGPT Claude2 Bard等 他们也都擅长生成代码 再介绍一些独立的垂直应用 他们更专注于编程领域 提供独立工
  • Elasticsearch生产环境硬件配置建议

    这里给大家分享下从官网上找到的两篇文章 基于2 x版本的 https www elastic co guide cn elasticsearch guide current hardware html 网上大部分文章都是基于这块的 也很好找
  • Android版本管理解决方法小议

    Android版本管理解决方法小议 Android版本混乱 目前的Android用户想升级4 0 即使能升级 时间周期上也是非常长的 而至于能不能升级 我想大部分用户的回答都是不能 你问我为什么 厂商不高兴给我升级 这在很大成都上引起了用户
  • yum更新及socat安装

    wget no cache http www convirture com repos definitions rhel 6 x convirt repo O etc yum repos d convirt repo yum makecac
  • 基于深度学习的目标检测研究综述

    基于深度学习的目标检测研究综述 摘要 深度学习是机器学习的一个研究领域 近年来受到越来越多的关注 最近几年 深度学习在目标检测领域取得了不少突破性的进展 已经运用到具体的目标检测任务上 本文首先详细介绍了基于候选区域和基于回归这两大主流的目
  • 抓包 服务器主动发送断开信号,基于iOS终端的WiFi认证自动弹出认证页面的方法...

    1 一种基于iOS终端的WiFi认证自动弹出认证页面的方法 其特征在于 包括 步骤S100 在计算机上安装抓包工具和CentOS桌面系统 步骤S200 配置DNS服务器 安装Dnsmasq 配置Dnsmasq配置文件 启动Dnsmasq服务
  • python中request获取数据,Python 中request数据的获取

    app route users methods GET POST def users print Hello World print request data 同 request get data print request json 如何
  • boost库使用

    个人博客地址 https cxx001 gitee io windows下boost库使用 下面介绍完整安装boost库的方法 1 去boost官网下载最新的boost库 boost库官网 2 解压boost压缩包 打开根目录 双击运行bo
  • nvm的简介、安装、配置使用及常用命令

    一 简介 nvm是一个node的版本管理工具 可以简单操作node版本的切换 安装 查看等 与npm不同的是 npm是依赖包的管理工具 nvm是nodejs的版本管理工具 通过它可以安装和切换不同版本的nodejs 二 安装 可以在GitH
  • 走进人工智能

    前言 AI IoT是指人工智能 AI 与物联网 IoT 的结合 智能物联网是一种技术体系 通过连接和集成物理设备 传感器和互联网 实现设备之间的智能交互和数据共享 为人们提供智能化 自动化和高效化的生活和工作体验 文章目录 序言 背景 领跑
  • 小皮面板(phpstudy)网站浏览器打开显示目录结构

    报错提示 403 解决方案 打开配置文件 打开响应的配置文件设置一下内容 注释掉默认页 index index php index html error index html autoindex on autoindex exact siz
  • python中列表推导式的基本格式_Python 列表推导式

    一 列表推导式 简介 列表推导式 list comprehension 是利用其它列表创建新列表的一种方式 工作原理类似for循环 即可对得到的元素进行转换或者筛选 1 1 列表推导式的基本格式 变量名 表达式 for 变量 in 列表 变
  • DICOM文件中读取对齐方式以及判断元素是否为显示VR还是隐式VR的方法

    1 对齐方式的读取 字节对齐方式在 0002 0010 中 一共有三种值 1 2 840 10008 1 2 隐式VR 小端 1 2 840 10008 1 2 1 显式VR小端 1 2 840 10008 1 2 2 显式VR大端 2 显
  • 重载,覆盖,隐藏区别

    重载 相同的范围 在同一个类中 函数名字相同 参数不同 virtual关键字可有可无 隐藏 如果派生类的函数与基类的函数同名 但是参数不同 无论有无virtual关键字 基类的函数将被隐藏 如果派生类的函数与基类的函数同名 但是参数相同 基
  • 用java实现用户登录

    方法1 直接设置用户名及密码登录 public static void main String args 用户名及密码 String username 123456798 String passward 123456 键盘输入 for in
  • 【AnyQ】百度开源 FAQ 问答系统—AnyQ介绍

    前言 近年来 随着人工智能技术的发展 人机对话技术得到越来越多的关注 人机对话产品也不断涌现 其中 智能客服作为人机对话的一个典型场景表现出极大的商业潜力和很强的研究价值 各企业也争先恐后的推出自己的智能客服产品 FAQ 问答技术作为智能客
  • Servlet初识

    servlet server applet 处理客户端请求 工作原理 tomcat容器 Servlet容器 服务器 Servlet框架 Servlet应用 1 首先客户端发起请求 2 服务器 tomcat Servlet容器 收到接收到来自
  • C指针之初始化(三)

    一 引言 C C 语言中引入了指针 使得程序能够直接访问内存地址 使得很多复杂的操作变得简单 同时也提高了程序的运行效率 指针即是地址 但是地址却是通过指针变量来存储的 因此我们通常所说的指针在很多时候说的都是指针变量 指针变量在使用之前必