c语言char指针用法,整理C语言中各种类型指针的特性与用法

2016

指针为什么要区分类型:

在同一种编译器环境下,一个指针变量所占用的内存空间是固定的。比如,在16位编译器环境 下,任何一个指针变量都只占用8个字节,并不会随所指向变量的类型而改变。

虽然所有的指针都只占8个字节,但不同类型的变量却占不同的字节数。

一个int占用4个字节,一个char占用1个字节,而一个double占用8字节;

现在只有一个地址,我怎么才能知道要从这个地址开始向后访问多少个字节的存储空间呢,是4个,是1个,还是8个。

所以指针变量需要它所指向的数据类型告诉它要访问多少个字节存储空间。

也就是说,如果不指定指针的类型,那么当指针指向一个变量的时候,她从首地址开始,但是它不知道什么时候停止,它不知道要访问多少个存储空间。比如有一个char类型的变量,我用一个指针指向它,但是这个指针我设置成int类型,这样一来这个指针就会向后访问四个字节的存储空间,很明显得到的结果不是char类型应该得到的,所以要区分类型。

只有指针是可以运算(移动)的,数组名是不可以的。

1

2

3

4int x[10];

x++;//illegal

int* p = x;

p++;//legal

两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。

实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。

(pointer2地址值 - pointer地址值) / sizeof(所指向数据类型)

指针之间可以相减,但不可以相加(相加无意义)。

定义字符串:

字符数组:

1

2char string[] ="hello";

printf("%s\n",string);

字符串指针指向字符串:

1char *str ="hello"

使用字符数组来保存的字符串是存在”栈”里的,所以它是可读可写的,所以我们可以修改字符数组里的某个元素的值。

但是,使用字符指针来保存字符串,它保存的是字符串常量地址,"常量区"是只读的,所以是不可改的。

1

2char *str ="hello";

*(str+1) ='w';// 错误

使用注意:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15char *str;

scanf("%s", str);

/* str是一个野指针,他并没有指向某一块内存空间,所以不允许这样写。如果给str分配内存空间是可以这样用的 */

/********* 数组的方法****************/

char name[20];

scanf("%s",name);

/************* 给字符针针分配内存空间的办法***********/

char *name;

name=(char*)malloc(50);//此时name已经指向一个刚刚分配的地址空间。

scanf("%s",name);

指针函数(是函数,返回值是指针)注意:

如果函数返回一个字符串,那么如果用一个数组以下面的形式来接的话,是会报错的:

1

2

3

4

5

6

7

8

9

10

11

12char *test() {

return "hello";

}

int main(int argc,const char * argv[]) {

char names[10];

names = test();

return 0;

}

这是因为,返回的字符串相当于一个这样的数组:{‘h', ‘e', ‘l', ‘l', ‘o', ‘\0'},但是前面我们说过,数组如果在定义的时候没有用{}这种方式初始化,那么后面就不能再用这种方式初始化了,所以会出错。

解决方法:将char names[10]改为char *names或者char names[10]直接等于test()。

函数指针(是指针,指向函数):

格式:函数的返回值类型 (*指针变量名) (形参1, 形参2, ...);

1

2

3

4

5

6

7int sum(int a,int b)

{

return a + b;

}

int (*p)(int,int);

p = sum;

应用场景:

调用函数

将函数作为参数在函数间传递

函数指针能更灵活:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26int minus(int a,int b)

{

return (a - b);

}

int add(int a,int b)

{

return (a + b);

}

int myFunction(int a,int b,int (*funcP) (int,int))

{

return funcP(a, b);

}

int main()

{

int minusResult = myFunction(10, 20, minus);

int addResult = myFunction(10, 20, add);

...

return 0;

}

/*

函数指针能让程序更灵活,比如后续有乘、除函数的时候,只需实现这两个函数然后在主函数调用myFunction函数即可。如果是多人协作,不同的人写不同的功能,如果我们来写myFunction那么基本就不用修改就可以一直使用,非常灵活。

*/

技巧:

1、把要指向函数头拷贝过来

2、把函数名称使用小括号括起来

3、在函数名称前面加上一个*

4、修改函数名称

使用注意:

由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的。

如上例,如果想使用p这个函数指针,可以直接向使用sum一样:

1int result = p(10, 10);

也可以这样:

1int result = (*p)(10, 10);

结构体是一种自定义数据类型,注意,它是数据类型。

1

2

3

4

5

6struct Student {

char *name;

int age;

};

struct Student stu;

注意,结构体的后面是有 ; 的。

在使用结构体类型的时候,要加上struct关键字。

定义结构体类型的同时定义变量:

1

2

3

4struct Student {

char *name;

int age;

} stu;

这种在定义的同时也定义了变量,就相当于:

1

2

3

4

5

6struct Student {

char *name;

int age;

};

struct Student stu;

定义结构体类型的同时定义变量,以后如果想继续使用这个结构体类型,仍然可以使用常规的方式定义:

1struct Student newStu;

匿名结构体定义结构体变量:

1

2

3

4struct {

char *name;

int age;

} stu;

这种匿名方式与上面的方式相比,虽然看起来更简洁(省去了结构名),但是要注意,这只能定义一个stu变量,而不能再定义新的变量,因为结构名没有了。

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

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

相关文章

java message_Java Message System简介

java messageJava消息系统 在本文中,我将讨论面向消息的中间件 (MOM)以及JMS如何在Enterprise Java中实现它。 此外,我还将讨论适合JMS使用的典型用例以及用于讨论消息传递解决方案的不同术语,例如Publisher / Sender …

c语言小游戏 精简_一个简易的贪吃蛇小游戏C语言源码

/**程序名称:贪吃蛇v2.1*程序描述:一个简易的贪吃蛇小游戏*版本信息:v2.1*v1.1版本更新:1:加入菜单选择项*v1.2版本更新:1:修复菜单选择bug*v1.3班本更新:1:加入难度选择…

IntelliJ IDEA for Mac 如何设置 tab 键为 4 个空格?

使用快捷键 Command , 打开偏好设置窗口如下所示: 设置好以后,可以按 Option Command L 整理格式,然后选中缩进的部分,如果能选中缩进的部分,证明是空格: 如果不想整理格式,还可以用 edit…

gc垃圾收集器 与gc算法_GC解释:收集器概述

gc垃圾收集器 与gc算法当前版本的HotSpot JVM包括三种类型的垃圾收集器: –串行收集器 –并行收集器 –多数同时收集者 它们都是世代的,这意味着它们利用了堆的划分方式 。 垃圾收集器负责三个主要操作: –查找不再使用的对象 –释放这…

安兔兔跑分可信吗_安兔兔安卓手机跑分性能榜公布:第一名实至名归?

3月5日消息,安兔兔官方放出了2019年2月份国内安卓手机的性能跑分排行榜。从榜单中我们可以看到排名前三的分别是:小米9、联想Z5 Pro GT 855版、红魔Mars电竞手机。不出所料,前三名都是高通平台的旗舰Soc,骁龙855和骁龙845。骁龙85…

c语言sort函数排序二维数组,c++ - 如何使用stl sort函数根据第二列对二维数组进行排序? - 堆栈内存溢出...

stl排序要求迭代器的rvalue作为参数传递。 如果你想使用sort函数,你必须在c 11中编译并使用数组stl来存储数组。 代码如下#include "bits/stdc.h"using namespace std;bool compare( array a, array b){return a[0]}int main(){int i,j;array, 5> ar1…

IntelliJ IDEA for Mac 类和方法注释模板设置

文章目录类注释模板设置使用 File and Code Templates方法 1:直接在编辑区编写模板代码方法 2:使用 parse 指令来引用注释模板使用 Live Templates方法注释模板设置注意事项解决注释模板无法获取参数名和返回值类型的问题类注释模板设置 使用 File and …

java streams_使用JShell的Java 9 Streams API

java streams这篇文章着眼于使用JShell的Java 9 Streams API。 Streams API的更改以Java 8中Streams的成功为基础,并引入了许多实用程序方法– takeWhile,dropWhile和iterate。 这篇文章延续了My Top Java 9功能,并使用Jshell探索了这些方法。…

c语言中dfs用pos做参数,LeetCode算法练习——深度优先搜索 DFS(2)

更多干货就在我的个人博客 BlackBlog.tech 欢迎关注!也可以关注我的csdn博客:黑哥的博客谢谢大家!我们继续LeetCode之旅.做了一段时间的LeetCode,感觉还是不错的。算法很基础,没有特别难的(至少我看在做的)&#xff0c…

机试题型_2020年焊工(技师)新版试题及焊工(技师)试题及答案

题库来源:安全生产模拟考试一点通公众号小程序2020年焊工(技师)新版试题及焊工(技师)试题及答案,包含焊工(技师)新版试题答案和解析及焊工(技师)试题及答案练习。由安全生产模拟考试一点通公众号结合国家焊工(技师)考试最新大纲及焊工(技师)考试真题汇总…

Eclipse 如何修改默认工作空间和切换工作空间(Workspace)

文章目录如何关闭/开启 Eclipse Launcher 弹窗提示通过配置文件设置通过 IDE 的偏好设置如何修改 Eclipse 默认的工作空间和切换工作空间通过配置文件修改通过 Eclipse Launcher 窗口修改通过菜单来切换工作空间如何关闭/开启 Eclipse Launcher 弹窗提示 通过配置文件设置 ec…

hashmap java_Java – HashMap详细说明

hashmap javaHashMap基于哈希算法工作,根据Java文档HashMap具有以下四个构造函数, 建设者 描述 HashMap ​() 构造一个空的 具有默认初始容量(16)和默认加载因子(0.75)的HashMap 。 HashMap ​(int i…

Tomcat 的目录结构

bin:存放的是可执行文件,比如启动和关闭服务器的一些脚本命令 conf:存放的是 Tomcat 服务器的各种全局配置文件,其中包括 server.xml(Tomcat的主要配置文件)、tomcat-users.xml 和 web.xml 等配置文件 li…

广州电子厂房净化工程_简述设计电子车间净化工程的注意要点

在电子车间净化工程的设计、安装、选择净化设备与彩钢夹芯板的时候有哪些需要注意的要点呢?这些看起来不太重要的细节,却往往大大的影响了电子净化车间的净化效率与洁净度。而且这些注意要点,不仅在电子净化车间中适用,在食品加工厂、制药净…

C语言循环结构素数判断,C语言实验之判断素数(循环结构java)方法讲解

C语言实验之判断素数(循环结构java)方法讲解Problem Description从键盘上输入任意一个正整数&#xff0c;然后判断该数是否为素数。如果是素数则输出"This is a prime."否则输出“This is not a prime.”Input输入任意一个正整数n(1 < n < 1000000)。Output判断…

使用log4j记录日志_使用log4j2免费分配日志记录

使用log4j记录日志介绍 最近&#xff0c;我正在为一个客户端工作&#xff0c;试图为大型精心制作的Java系统消除一些GC暂停。 经过分析后&#xff0c;我意识到大部分垃圾都是通过日志记录产生的&#xff01; 是否有一种简单的方法来删除所有分配&#xff1f; 原来有:) 我应该使…

Java Web工程结构_项目结构

文章目录Eclipse 的 Java Web 工程目录结构IDE 的目录结构截图本地的工作空间&#xff08;Workspace&#xff09;中的目录结构目录说明Eclipse 的 Java 工程目录结构IDE 的目录结构截图本地的工作空间中的工程目录MyEclipse 的 Java Web 工程目录结构IDE 目录结构截图本地的工作…

一天发多少短信会封号_枸杞一天吃多少?吃多了会怎样?黑枸杞红枸杞哪个好?...

●枸杞一天吃多少&#xff1f;其实枸杞作为一种滋补品&#xff0c;不适合过多的使用&#xff0c;因为那样反而会造成反作用和不良影响&#xff0c;健康的成年人每天吃20克左右就合适了&#xff0c;这样对一些疾病的治疗&#xff0c;才可以发挥更好的效果。如果是用枸杞子泡水喝…

c语言线程传int值,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统&#xff0c;C语言实现多线程&#xff1a;#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦&#xff0c;参数是&#xff1a;%s\n" , (char *)threadArg );return …

aws集群重启_在AWS中设置Cassandra集群

aws集群重启Apache Cassandra是一个NoSQL数据库&#xff0c;它使用一致的哈希机制可以轻松进行水平扩展。 七年前&#xff0c;我尝试了它&#xff0c;并决定不将其用于我的附带项目&#xff0c;因为它太新了。 现在情况有所不同&#xff0c;Cassandra早已建立起来&#xff0c;背…