【C语言】善于利用指针(二)

news2024/12/25 23:55:49

💗个人主页💗
⭐个人专栏——C语言初步学习⭐
💫点击关注🤩一起学习C语言💯💫

目录

  • 导读:
  • 1. 字符指针
    • 1.1 字符串的引用方式
    • 1.2 有趣的面试题
  • 2. 数组指针
    • 2.1 一维数组指针的定义
    • 2.2 一维数组指针的使用
    • 2.3 二维数组指针的地址
    • 2.4 二维数组指针的使用

导读:

前面我们学习了善于利用指针一,主要讲解了指针的定义、基本用法和一些简单的运算使用,算是指针的初步学习了。
今天我们来学习指针的进阶。
后面还有第三部分的讲解,点击关注,掌握第一信息

1. 字符指针

在前面学习指针的类型中,我们知道有一种指针类型为字符指针char*
一般使用:

int main()
{
	char ch = 'w';
	char* pc = &ch;
	*pc = 'w';
	return 0;
}

1.1 字符串的引用方式

在C程序中,字符串是存放在字符数组中的。我们可以用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。

int main()
{
	char* pstr = "I love China!";
	//这里是把一个字符串放到pstr指针变量里了吗?
	printf("%s\n", pstr);
	return 0;
}

运行结果
特别容易让同学以为是把字符串 I love China! 放到字符指针pstr 里了,但是本质是把字符串 I love China! 首字符的地址放到了pstr中。
在这里插入图片描述
注意:

char * pstr = "I love China!";

等价于

char * pstr;//定义一个char*型变量
pstr = "I love China!";
//把字符串第一个元素的地址赋给字符指针变量pstr

1.2 有趣的面试题

int main()
{
	char str1[] = "hello world.";
	char str2[] = "hello world.";
	const char* str3 = "hello world.";
	const char* str4 = "hello world.";
	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;
}

我们来看输出结果并思考是为什么
在这里插入图片描述
我们进入调试看一下:
在这里插入图片描述

  • 这里str3和str4指向的是一个同一个常量字符串。
  • C/C++会把常量字符串存储到单独的一个内存区域。
  • 当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。
  • 但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。
  • 所以str1和str2不同,str3和str4不同。

2. 数组指针

我们在之前提到了数组指针,今天我们再进一步的了解数组指针的使用

2.1 一维数组指针的定义

数组指针:能够指向数组的指针。
数组指针的定义方式与指针的定义方式类似,只不过需要在变量名字之前添加一个数组类型的修饰符。

  int *p1[10];//一维数组指针
  int (*p2)[10];//二维数组指针

p2先和*结合,说明p2是一个指针变量,然后指向的是一个大小为10个整型的数组。所以p2是一个指针,指向一个数组,叫数组指针。

这里要注意:[]的优先级要高于 * 号的,所以必须加上()来保证p先和结合。

2.2 一维数组指针的使用

  1. 可以通过数组指针进行数组的遍历和修改。
int main()
{
	int arr[5] = { 1, 2, 3, 4, 5 };
	int(*ptr)[5] = &arr;
	for (int i = 0; i < 5; i++) 
	{
		(*ptr)[i] *= 2;
	}
	printf("%d\n",arr[2]);
	// 输出6,数组第三个元素已经被修改为原来的两倍
}

在这里插入图片描述

  1. 通过数组指针数组的传递和返回。
void print_arr(int(*ptr)[5], int len) 
{
    for (int i = 0; i < len; i++) 
    {
        printf("%d ", (*ptr)[i]);
    }
}
int main() 
{
    int arr[5] = { 1, 2, 3, 4, 5 };
    int(*ptr)[5] = &arr;
    print_arr(ptr, 5); 
    // 输出1 2 3 4 5
    return 0;
}

在这里插入图片描述

2.3 二维数组指针的地址

假设二维数组的起始地址为2000,一个整型占4个字节,arr+1的值应该是2000+4x4=2016,arr+2的值为2032
在这里插入图片描述

表示形式含义
arr二维数组名,指向一维数组arr[0],即0行起始地址2000
*(arr+0) arr[0],*arr0行0列元素地址2000
arr+1,&arr[1]1行起始地址2016
arr[1],*(arr+1)1行0列元素arr[1][0]的地址2016
*(arr+1)+2,&arr[1][2],arr[1]+2,1行2列元素arr[1][2]的地址2024
* ( arr[1]+2), * ( *(arr+1)+2), arr[1][2]1行2列元素arr[1][2]的值是元素值,为7

2.4 二维数组指针的使用

传递数组指针给函数:

void print_arr(int (*p)[4], int row) 
{
    for (int i = 0; i < row; i++) 
    {
        for (int j = 0; j < 4; j++) 
        {
            printf("%d ", *(*(p+i)+j));
        }
        printf("\n");
    }
}

int main() 
{
    int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
    print_arr(arr, 3);  
    // 传递数组指针arr给函数print_arr
    return 0;
}

在这里插入图片描述

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

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

相关文章

消息队列技术选型:这 7 种消息场景一定要考虑!

大家好&#xff0c;我是君哥。 我们在做消息队列的技术选型时&#xff0c;往往会结合业务场景进行考虑。今天来聊一聊消息队列可能会用到的 7 种消息场景。 1 普通消息 消息队列最基础的功能就是生产者发送消息、Broker 保存消息&#xff0c;消费者来消费消息&#xff0c;以…

在vue2中,v-model和.sync的区别

最近在封装一个弹窗组件时&#xff0c;用了比较复杂的逻辑去做显示和隐藏的逻辑&#xff0c;在查看同事的代码之后&#xff0c;才知道还有更简单的方法&#xff0c;自己已经忘了一些API. popup组件里统一的template&#xff1a; <div v-ifisShowPopup> // 弹窗内容 <…

手机图片合成gif怎么操作?用这个网站试试

制作gif动图的工具越来越多&#xff0c;但是很多时候使用电脑并不方便&#xff0c;想要在手机上制作gif动图的时候应该怎么办呢&#xff1f;很简单&#xff0c;给大家分享一款无需下载手机浏览器就能操作的gif制作&#xff08;https://www.gif.cn/&#xff09;工具-GIF中文网&a…

分库分表理论总结

一、概述 分库分表是在面对高并发、海量数量时常见的数据库层面的解决方案。通过把数据分散到不同的数据库中&#xff0c;使得单一数据库的数据量变小来缓解单一数据库的性能问题&#xff0c;从而达到提升数据库性能的目的。比如&#xff1a;将电商数据库拆分为若干独立的数据…

计算机考研 | 2019年 | 计算机组成原理真题

文章目录 【计算机组成原理2019年真题45题-16分】【第一步&#xff1a;信息提取】【第二步&#xff1a;具体解答】 【计算机组成原理2019年真题46题-7分】【第一步&#xff1a;信息提取】【第二步&#xff1a;具体解答】 【计算机组成原理2019年真题45题-16分】 【第一步&#…

FreeTAKServer安装教程

项目地址 https://github.com/FreeTAKTeam/FreeTakServer 环境说明 FreeTakServer使用python开发&#xff0c;所以需要安装python,本教程安装的python版本为python3.11,系统为ubuntu 20.04 安装 安装FreeTakServer 安装FreeTAKServer pip install FreeTakServer启动Free…

Canvas--》使用Canvas完成基本绘图

&#x1f31f;Canvas介绍 <canvas>是一个可以使用脚本 (通常为javaScript) 来绘制图形的HTML元素。例如&#xff0c;它可以用于绘制图表、制作图片构图或者制作简单的动画。如上面效果示例就是使用 <canvas> 来实现示例&#xff0c;后续将一步步实现上面效果。 C…

HDLbits: ece241 2014 q4

module top_module (input clk,input x,output z ); reg [2:0] Q;always(posedge clk)beginQ[0] < Q[0] ^ x;Q[1] < (~Q[1]) & x;Q[2] < (~Q[2]) | x;z < ~(| Q[2:0]); //错误&#xff01;&#xff01;&#xff01;&#xff01;endendmodule 正确答案&#xf…

Python python-docx 使用教程

openpyxl是Python下的Word库&#xff0c;它能够很容易的对Word文档进行读取 安装方法&#xff1a;pip install python-docx国内镜像安装&#xff1a;pip install -i https://mirrors.aliyun.com/pypi/simple/ python-docx&#xff08;推荐&#xff0c;安装更快&#xff09;中文…

【算法】关于排序你应该知道的一切(下)

和光同尘_我的个人主页 单程孤舟&#xff0c;出云入霞&#xff0c;如歌如吟。 --门孔 八大排序 &#x1f56f;️前言1. 常见排序算法2. 常见排序算法实现2.1. 冒泡排序2.1.1. 基本思想2.1.2. 代码实现2.1.3. 特性 2.2. 快速排序2.2.1. hoare法基本思想代码实现 2.2.2. 快速排…

静图表情包怎么做成动态图?动图表情包制作教程

静态的图片不如动态的图片吸引人&#xff0c;动态的图片内容丰富、生动&#xff0c;体积小还易于传播保存。Gif格式动图其实就是由一帧一帧的图片合成的带有动态效果的图片。下面&#xff0c;给大家介绍一下动图gif制作&#xff08;https://www.gif.cn/&#xff09;的方法&…

asp.net班级管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net班级管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开发 asp.net班级管理系统 二、功能介绍 1…

操作系统和进程相关的认识

目录 冯诺依曼体系结构 冯诺依曼体系结构五大组成部分 为什么数据只能通过存储器进行输入和输出 操作系统 概念一&#xff1a;访问操作系统的请求都是通过系统调用完成的 操作系统如何管理用户信息 概念二&#xff1a;先描述&#xff0c;再组织。 进程的概念 在认识进行相关的知…

Java基础--泛型详解

一、背景 java推出泛型之前&#xff0c;集合元素类型可以是object类型&#xff0c;能够存储任意的数据类型对象&#xff0c;但是在使用过程中&#xff0c;如果不知道集合里面的各个元素的类型&#xff0c;在进行类型转换的时候就很容易引发ClassCastException异常。 二、概念 …

POJ 2104 K-th Number 平方分割(分桶法)

一、题目大意 长度为n&#xff08;n<100000&#xff09;的数组&#xff0c;进行m次查询&#xff08;m<5000&#xff09;&#xff0c;每次查询时&#xff0c;输入为 i j k&#xff0c;返回为数组 [i,j] 的分片里第k大数字&#xff08;1<i<j<n,k<j-i1) 二、解…

基于Java的校园自助洗衣系统设计与实现(源码+lw+ppt+部署文档+视频讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

python机器学习之梯度下降法

系列文章目录 第一章 Python 机器学习入门之线性回归 第一章 Python 机器学习入门之梯度下降法 梯度下降法 系列文章目录前言一、梯度下降法1.梯度下降法简介2.基本原理 梯度下降函数效果展示 前言 上一篇文章里面说到了用梯度下降法来对最小化代价函数和模型参数进行求解&am…

计算机网络八股

1、请你说说TCP和UDP的区别 TCP提供面向连接的可靠传输&#xff0c;UDP提供面向无连接的不可靠传输。UDP在很多实时性要求高的场景有很好的表现&#xff0c;而TCP在要求数据准确、对速度没有硬件要求的场景有很好的表现。TCP和UDP都是传输层协议&#xff0c;都是为应用层程序服…

八、【快速选择工具组】

文章目录 对象选择工具快速选择工具魔棒工具 对象选择工具 当我们选择对象选择工具时&#xff0c;需要先注意上边有一个循环的圆&#xff0c;它会进行内容识别&#xff0c;当识别完成会停止旋转。这个时候我们按住n键&#xff0c;或者将鼠标放上对应的图形时会出现选中的颜色。…

多实例学习MIL(easy / hard)

多示例学习&#xff08;Multiple Instance Learning&#xff09; - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/377220948 多示例学习 和弱监督&#xff08;weakly supervised&#xff09;有一定的关系&#xff0c;弱监督weakly supervised有三个含义&#xff08;或者说三…