指针(二)

news2024/11/27 15:49:49

这里写目录标题

      • 字符指针
        • 字符指针与常量字符串的区别:
      • 指针数组
      • 数组指针
      • 两者的区别:
      • &数组名 ,sizeof(arr)
      • 数组指针的使用
      • 数组参数,指针参数
        • 一维数组传参
          • 整型数组:
          • 整型指针数组:
      • 一级指针传参
      • 二级指针传参

字符指针

字符指针:char*
一般用法:

#include<stdio.h>
int main()
{
	char ch = 'w';
	char* p = &ch;  // 将字符变量ch的地址放在了字符指针p中
	return 0;
}

另一种表示方法:

#include<stdio.h>
int main()
{
	const char* p = "hello csdn.";
	printf("%c\n", *p);//打印字符'h'
	printf("%s\n", p);//打印字符串"hello csdn."
	return 0;
}

字符指针p中存放的是字符串的首元素地址,即字符’h’的地址。

字符指针与常量字符串的区别:
#include <stdio.h>
int main()
{
	char str1[] = "hello csdn.";
	char str2[] = "hello csdn.";
	char *str3 = "hello csdn.";
	char *str4 = "hello csdn.";
	if (str1 == str2)
		printf("str1 and str2 are same\n");
	else
		printf("str1 and str2 are not same\n");
 
	if (str3 == str4)
		printf("str3 and str4 are same\n");
	else
		printf("str3 and str4 are not same\n");
 
	return 0;
}

运行结果:
在这里插入图片描述
题目中str1和str2是两个字符数组,比较str1和str2时,相当于比较数组str1和数组str2的首元素地址,而str1与str2是两个不同的字符数组,创建数组str1和数组str2实惠开辟两块不同的空间,他们的首元素地址当然不同.

指针数组

在这里插入图片描述

数组指针

整型指针是指向整型的指针,字符指针是指向字符的指针,数组指针应该就是指向数组的指针了.

数组指针也是一样,我们只需取出数组的地址,并将其存入数组指针即可。

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	int(*p)[10] = &arr;
	//&arr - 数组的地址
	return 0;
}

在这里插入图片描述
数组的类型是int [10]

两者的区别:

首先p是一个指针,所以p必须要先与 * 结合,而[ ]的优先级要高于 * ,所以我们要加上( )以便让p与 * 先结合。

在这里插入图片描述

&数组名 ,sizeof(arr)

数组名代表整个数组的地址的情况其实只有两种:

  1. &数组名。
  2. 数组名单独放在sizeof内部,即sizeof(数组名)。
    除此之外,所有的数组名都是数组首元素地址。
#include<stdio.h>
int main()
{
	int arr[5] = { 1, 2, 3, 4, 5 };
	int* p1 = arr;//数组首元素的地址
	int(*p2)[5] = &arr;//数组的地址
	printf("%p\n", p1);
	printf("%p\n", p2);
 
	printf("%p\n", p1+1);
	printf("%p\n", p2+1);
	return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述

数组指针的使用

数组指针有一个简单的使用案例,那就是打印二维数组:

#include<stdio.h>
void print(int(*p)[5], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)//行数
	{
		int j = 0;
		for (j = 0; j < col; j++)//列数
		{
			printf("%d ", *(*(p + i) + j));
		}
		printf("\n");//打印完一行后,换行
	}
}
int main()
{
	int arr[3][5] = { { 1, 2, 3, 4, 5 }, { 2, 3, 4, 5, 6 }, { 3, 4, 5, 6, 7 } };
	print(arr, 3, 5);//传入二维数组名,即二维数组首元素地址,即二维数组第一行的地址
	return 0;
}
p+i:是第i行的首地址.
*(p+i):是第i行第0列元素的地址.
*(p+i)+j:是第i行第j列元素的地址.
*(*(p+i)+j):是第i行第j列元素所对应的值.

数组参数,指针参数

一维数组传参
#include<stdio.h>
void test1(int arr[10])//数组接收
{}
void test1(int *arr)//指针接收
{}
void test2(int *arr[20])//数组接收
{}
void test2(int **arr)//指针接收
{}
int main()
{
	int arr1[10] = { 0 };//整型数组
	int *arr2[20] = { 0 };//整型指针数组
	test1(arr1);
	test2(arr2);
}
整型数组:

当向函数传入整型数组的数组名时,我们有以下几种参数可供接收:

  1. 数组传参数组接收,我们传入的是整型数组,那我们就用整型数组接收。
  2. 传入的数组名本质上是数组首元素地址,所以我们可以用指针接收。数组的元素类型是整型,我们接收整型元素的地址用int * 的指针即可。
整型指针数组:

当向函数传入整型指针数组的数组名时,我们有以下几种参数可供接收:

  1. 数组传参数组接收,我们传入的是整型指针数组,那我们就用整型指针数组接收。
  2. 指针接收,数组的元素是int * 类型的,我们接收int * 类型元素的地址用二级指针int ** 即可。
    注意:一维数组传参,函数形参设计时[ ]内的数字可省略。

一级指针传参

#include<stdio.h>
void print(int* p, int sz)//一级指针接收
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
}
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;//一级指针
	print(p, sz);       // 直接print (arr ,sz) 也可以
	return 0;
}

二级指针传参

#include<stdio.h>
void test(int** p)//二级指针接收
{}
int main()
{
	int a = 10;
	int* pa = &a;
	int** paa = &pa;
	test(paa);//二级指针
	return 0;
}

函数的参数可以传递什么形式?
以下三种:

#include<stdio.h>
void test(int** p)
{}
int main()
{
	int a = 10;
	int* pa = &a;
	test(&pa);//可以传入一级指针的地址
	int** paa = &pa;
	test(paa);//可以传入二级指针
	int* arr[10];
	test(arr);//可以传入一级指针数组的数组名
	//...
	return 0;
}

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

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

相关文章

openai 1.3.x 版本 openai.APITimeoutError: Request timed out. 解决

问题描述 openai 1.3.x 版本 请求出现 Request timed out File "E:\Python\Python312\Lib\site-packages\openai\_base_client.py", line 920, in _request return self._retry_request( ^^^^^^^^^^^^^^^^^^^^ File "E:\Python\Python312\L…

数据结构与算法编程题48

有向图的邻接表 #include <iostream> using namespace std;#define MVnum 100 typedef string VertexType;typedef struct ArcNode {int adjvex;struct ArcNode* nextarc;int weight; }ArcNode;typedef struct VNode {VertexType data;struct ArcNode* firstarc; }VNode,…

NAS外网访问方案

基础流程 路由器开启端口映射&#xff08;如果有猫则要配置猫为转发模式&#xff0c;由路由器直接拨号即可使用第三方程序让内网ip发布到公网上&#xff08;如果有云服务器&#xff09;需要开启防火墙端口 好用的第三方程序 FRP穿透 优点&#xff1a;开源免费&#xff0c;速…

基于ssm学院党员管理系统论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对鄂尔多斯应用技术学院党员信息管理混乱&#xff0c;出错率高&#x…

金蝶云星空业务对象列表显示动态列

文章目录 金蝶云星空业务对象列表显示动态列需求设计开发实现列表插件字段标题数据绑定前事件数据绑定列表插件注册测试 金蝶云星空业务对象列表显示动态列 需求设计 《产品序列号档案》的序列号、适用组织分别关联《序列号主档》的序列号字段&#xff0c;的适用组织表的组织…

Java简易版 TCP协议一对一聊天

客户端 package 二十一章;import java.io.*; import java.net.Socket; import java.util.Date; import javax.swing.*;public class Server {private JFrame jf;private JButton jBsend;private JTextArea jTAcontent;private JTextField jText;private JLabel JLcontent;priv…

1.pipenv创建pyqt5虚拟环境

pipenv创建pyqt5虚拟环境 一、安装pipenv ​ cmd输入指令&#xff1a; pip install pipenv二、安装虚拟环境 cmd进入我要创建环境的目录下 我使用以下命令在当前目录下创建虚拟环境&#xff1a; pipenv --python 3.8创建一个基于Python 3.8的虚拟环境&#xff0c;并生成一个…

深度探索Linux操作系统 —— 构建内核

系列文章目录 深度探索Linux操作系统 —— 编译过程分析 深度探索Linux操作系统 —— 构建工具链 深度探索Linux操作系统 —— 构建内核 文章目录 系列文章目录前言一、内核映像的组成 前言 内核的构建系统 kbuild 基于GNU Make&#xff0c;是一套非常复杂的系统。 对于编译内核…

【神化世界】asp网页500内部服务器错误的解决方法

问题解决方案记录 一、问题 在asp网页调试的时候&#xff0c;不小心改错了&#xff0c;好好的页面突然出现如下错误信息了&#xff1a; 二、解决方法 终于找到了问题所在&#xff0c;是sql语句出错造成的&#xff0c;特别记录一下。 正确的写法 sql"select * from mem…

好用的远程访问软件有哪些?

借助远程访问软件可以对不在身边的电脑进行远程控制或访问&#xff0c;这对于需要远程办公的人来说十分的方便&#xff0c;通过这些软件可以使团队协作和沟通不再受地域限制。市面上的远程访问软件有很多&#xff0c;有哪些好用的远程访问软件呢&#xff1f;这里&#xff0c;本…

【顶级神刊】IEEE旗下TOP,CCF-A,投稿5次也要一试再试,升职法宝,这本期刊逆天了!

计算机类 • 好刊解读 今天小编带来IEEE旗下计算机领域顶级神刊&#xff0c;CCF-A类推荐的期刊解读&#xff0c;众多作者投稿5次也要一试再试&#xff0c;究竟这本期刊如何&#xff1f;如您有投稿需求&#xff0c;可作为重点关注&#xff01;后文有相关领域真实发表案例&#…

网络安全攻击预警/态势预测算法汇总

总结&#xff1a; 网络安全攻击预警/态势预测算法众多&#xff0c;主要包括&#xff1a; 基于统计学的算法&#xff1a;协方差矩阵、马尔可夫模型等&#xff1b; 基于机器学习的算法&#xff1a;贝叶斯网络、聚类算法、支持向量机SVM、遗传算法、层次分析法AHP、决策树等&am…

Talk | UCSB博士生欧阳思琦: 利用词级别对比学习实现低资源下的语音翻译

本期为TechBeat人工智能社区第553期线上Talk。 北京时间12月6日(周三)20:00&#xff0c;加州大学圣塔芭芭拉分校博士生—欧阳思琦的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “利用词级别对比学习实现低资源下的语音翻译”&#xff0c;介绍了他…

扔掉sql语句,用 QxOrm 让你的数据库操作从来没有这么简单过!

ORM简介&#xff1a; ORM 全称是 Object Relational Mapping&#xff08;对象关系映射&#xff09;&#xff0c;是一种程序设计技术&#xff0c;用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说&#xff0c;它其实是创建了一个可在编程语言里使用的“虚拟…

优思学院|六西格玛质量管理的工具、方法和手段

质量管理涉及多种技术不同的手段&#xff0c;包括了理性分析的和数据分析的工具&#xff0c;绝大部分工具都可以在六西格玛绿带和黑带知识领域中找到&#xff0c;因此&#xff0c;质量人应该学好六西格玛。以下&#xff0c;我们列举一些常见的技术手段。 六西格玛项目方法&…

Java基础——桥洞盖小被

文章目录 1. ArryayList2. LinkedList3. HashMap 1. ArryayList 2. LinkedList 3. HashMap

免费的AI改写工具推荐,AI改写工具大全

在本文中&#xff0c;我们将专心分享AI改写的方法、工具以及技巧&#xff0c;旨在帮助大家更好地理解和利用写作利器。我们将揭示AI改写的背后原理&#xff0c;探讨目前市场上主流的AI改写工具&#xff0c;并分享一些提高改写效果的使用技巧。 AI改写的背后技术原理 在深入讨…

基于ssm学生请假系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本学生请假系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

构建socket的客户端和服务端

网络函数 WSAStartup socket bind listen accept connect send recv closesocket WSACleanup 为什么要用WSAStartup初始化&#xff1f; 本函数必须是应用程序或DLL调用的第一个Windows Sockets函数.它允许应用程序或DLL指明Windows Sockets API的版本号及获得特定Windows So…

Unity中Batching优化的动态合批

文章目录 前言一、动态合批的规则1、材质相同是合批的前提&#xff0c;但是如果是材质实例的话&#xff0c;则一样无法合批。2、支持不同网格的合批3、动态合批需要网格支持的顶点条件二、我们导入一个模型并且制作一个Shader&#xff0c;来测试动态合批1、我们选择模型的 Mesh…