【C语言】指针进阶第一站:字符指针 typedef关键字!

点击蓝字

657d55bda0af93dc2c10c9647991f351.png

关注我们

简单回顾一下指针的概念

内存会划分以字节为单位的空间,每一个字节都有一个编号(地址/指针)

指针变量可以存放这个地址/指针

注:我们日常所说的指针,一般是指针变量

下面让我们坐上指针进阶的直通车,来到第一站!字符指针

字符指针

代码示例:

int main()
{char ch = 'w';char* p= &ch;char* pa = "abcdef";return 0;
}

字符变量ch里面存放了字符w

字符指针p里面存放了ch的地址

指针变量pa里面存放了abcdef字符串的地址,我们并没有对这个字符串进行初始化。而是直接把它放进了指针变量pa里面。

和前两行的字符w不同,abcdef是存储在内存中的只读数据区,无法修改,即便通过指针也无法修改。

为了避免理解出错,我们一般会加上const修饰

const char* pa = "abcdef";

const放在*的左边

表示const修饰的指针指向的内容,表示指针指向的内容不能通过指针来改变

但是指针变量本身是可以改变的

const放在*的右边

表示const修饰的是指针变量本身,指针变量的内容不能被修改

但是*pa指针指向的内容是可以通过指针来修改的

代码示例:

int main()
{char arr1[] = "abcdef";char arr2[] = "abcdef";const char* str1 = "abcdef";const char* str2 = "abcdef";if (arr1 == arr2)printf("arr1==arr2\n");elseprintf("arr1!=arr2\n");if (str1 == str2)printf("str1==str2\n");elseprintf("str1!=str2\n");return 0;
}

它的结果如下:

8ba8b92dede09259e78c505b973d4564.png

在例子1里面我们提到过,str1和str2这种情况都指向一个常量字符串

既然字符串abcdef无法被改变,编译器也没有必要创建两个独立的内存空间来存放两个相同的字符串

所以str1和str2的地址是完全一样的

而arr1和arr2是完全不同的数组,它们的首元素地址不一样,打印的结果是不相等

typedef关键字

如何使用:

在MSDN中,我们可以查找到typedef的定义

deaafc06696fd6ff30639b8e6788db12.png

简单地说,typedef的作用就是把一个已有的类型名换一个新的名字

typedef int* pint;

这句代码的意思是:将int*命名为pint

pint在使用的时候和int*完全一致

我们仍然可以使用int*

在结构体里面,我们可以用typedef来缩短原有结构体定义的语句

如:将struct Stu命名为Stu

4ed33f86308864c75038f8dded90778c.png

typedef和#define的区别

我们同样可以使用#define语句,进行这项操作

#define PINT int*

定义语句PINT为int*

指针连续定义

先来了解一下如何正确连续定义两个指针

int*pa,*pb;//正确的连续定义int*pa,pb;//错误
//pa是int*类型,而pb是int类型

因为这两个的情况非常容易搞混,所以我们不建议连续定义指针

typedef int* pint;
#define PINT int*int main()
{pint pa,pb;//可连续定义指针//pa-->int*//pb-->int*PINT pa,pb;//等同于int*pa,pb//pa-->int*//pb-->int
}

        ·typedef会产生一个新的变量类型

        ·#define只是在对应位置进行替换

因为typedef产生了一个新的类型,pint为int*,但与int*也有不同

int pa,pb;//pa,pb都是int类型
pint pa,pb;//pa,pb都是int*类型

而我们直接用int*进行连续定义指针变量是错误的

int*pa,pb;//错误
//pa是int*类型,而pb是int类型

你学会了吗?我反正是学废了。

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

6be476bc24bc91abaf00b78bcc6da3e0.png

966d71b146584f622590398164ed214d.gif

戳“阅读原文”我们一起进步

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

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

相关文章

漫反射 高光反射_如何有效地使用反射

漫反射 高光反射本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题,包括对象创建,并发,序列化,反射等。 它将指导您完成Java掌握的旅程! 在这里查看 &#xff…

python编译helloworld_python3学习笔记--001--python HelloWorld

python默认使用UTF-8编码 一个python3版本的HelloWorld代码如下: #!/usr/bin/env python print (Hello World!) 如果此python脚本文件名为:hello.py,则运行此脚本文件的方法有两种: 1、python hello.py [laolanglocalhost python]…

漫谈 C++:良好的编程习惯与编程要点

点击蓝字关注我们以良好的方式编写C class假设现在我们要实现一个复数类complex,在类的实现过程中探索良好的编程习惯。① Header(头文件)中的防卫式声明complex.h: # ifndef __COMPLEX__ # define __COMPLEX__ class complex {} # endif防止头文件的内容被多次包含…

Python3只出现一次数字

Python3只出现一次数字原题 https://leetcode-cn.com/problems/single-number/ 题目: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时…

junit测试找不到数据库_将数据库日志添加到JUnit3

junit测试找不到数据库在过去的十年中,我们已经编写了成千上万的JUnit3测试,现在正尝试将结果合并到数据库中,而不是分散的日志文件中。 事实证明,扩展TestCase类非常容易做到这一点。 注意:这种方法并不直接适用于JUn…

python float 精度_浅谈Python里面小数点精度的控制

要求较小的精度 round()内置方法 这个是使用最多的,刚看了round()的使用解释,也不是很容易懂。round()不是简单的四舍五入的处理方式。 For the built-in types supporting round(), values are rounded to the closest multiple of 10 to the power min…

【C语言】指针进阶第二站:指针数组!

点击蓝字关注我们指针数组数组是一种类型的数的集合整型数组的元素都是int类型指针数组的元素都是指针变量int* arr1[10];//整型指针的数组char*arr2[10];//一级字符指针的数组char** arr3[5];//二级字符指针的数组参考这一份示意图示例1:定义多个字符指针在上一站的字符指针里…

Python3不用str自带lower转换位小写字母

Python3不用str自带lower转换位小写字母原题 https://leetcode-cn.com/problems/to-lower-case/ 题目: 不准用字符串自带的lower() API! 实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小…

php 命令执行crud_使用活动记录执行CRUD

php 命令执行crud本文是我们学院课程“ jOOQ –类型安全数据库查询”的一部分 。 在SQL和特定关系数据库很重要的Java应用程序中,jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多而JDBC过于抽象时,这是一种替代方法。 它显示了一种现代的领域特定语言…

python所有的父类_object代表所有类的父类吗??

作者:邹冲 链接:https://www.zhihu.com/question/19754936/answer/202650790 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 写东西的时候刚好遇到这个问题,回答一波…… 继承 obje…

C语言初学者常见错误 | 总结22点

点击蓝字关注我们正文一.语言使用错误在打代码的过程中,经常需要在中文与英文中进行转换,因此常出现一些符号一不小心就用错,用成中文。例如:“;”中文中的分号占用了两个字节,而英文中“;”分号只占用一个…

Python3实现队列

Python3实现队列class MyQueue:def __init__(self):self.__arr []def push(self, x: int) -> None:self.__arr.append(x)def pop(self) -> int:return self.__arr.pop(0)def peek(self) -> int:return self.__arr[0]def empty(self) -> bool:return len(self.__ar…

nginx配置vue项目500_一个Nginx部署多个vue前端项目总结

摘要:近来接手了一个二次开发的前后端分离模式的项目,其中在前端项目的部署上需要让2个前端项目都部署到一个IP地址和端口下,那么我们这里就要用到Nginx了,接下来我们看看如何在一个Nginx下部署2个前端项目的编译打包2个前端项目执…

vaadin_Vaadin和DukeScript中的Hello World

vaadin从表面上看 , Vaadin和GWT通常与DukeScript有很多共同点。 两者都致力于为Java开发人员提供面向浏览器的解决方案,并且由于其对Maven的原生支持,因此与IDE集成良好。 但是,这些方面实际上是它们共有的全部。 从编程模型到框…

【C语言】指针进阶第三站,数组指针!

点击蓝字关注我们数组指针整型指针:指向整型的指针字符指针:指向字符的指针数组指针:指向数组的指针基本概念下面哪个是数组指针呢?指针数组和数组指针的概念很容易混淆,一定要分清楚哦!int *p1[10]; int (…

Python3判断是否为回文数

Python3判断是否为回文数原题 https://leetcode-cn.com/problems/palindrome-number/ 题目: 不允许用str的方法! 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。…

lambda 序列化_如何以及为什么要序列化Lambda

lambda 序列化总览 lambda序列化在许多用例中很有用,例如持久配置或作为远程资源的访客模式 。 远程访客 例如,因此我想访问远程Map上的资源,可以使用get / put,但是说我只想从Map的值中返回一个字段,我可以将lambda作…

python进行数据查询_如何进行python数据库查询?(实例解析)

在这篇文章之中我们来了解一下关于python数据库的相关知识,有些朋友可能是刚刚接触到python这一编程语言,对这一方面不是特别的了解,在接下来这篇文章将会来带大家来了解关于python查询数据库中数据的相关知识。 数据库的查询操作 Python查询…

【C语言】指针进阶第四站:数组/指针的传参问题!

点击蓝字关注我们朋友们,到站啦!指针进阶第四站:传参问题0.引例自定义函数里形参的类型,要和函数调用中传过去的实参类型相对应test函数里的是int类型,我们传过去的参数a也是int类型void test(int n) {} int main() {i…

python做自动化控制postman_python自动化测试入门篇-postman

接口测试基础-postman 常用的接口有两种:webservice接口和http api接口。 Webservice接口是走soap协议通过http传输,请求报文和返回报文都是xml格式。 http api接口是走http协议,通过路径来区分调用的方法,请求报文都是key-value形…