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变量,而不能再定义新的变量,因为结构名没有了。

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

  1. C语言中的指针应用,函数指针,指针函数,结构体中定义函数指针。

    指针函数 指针函数就是一个返回指针的函数,其本质是一个函数,该函数的返回值是一个指针. 声明一个指针函数 int* fun(int x,int y); 例子 typedef struct _Data{ ...

  2. c语言char字符判断条件,C语言入门 — 字符型char

    本篇文章将会学习字符类型,并会结合 Ascii码对照表进行学习, 首先我们先来看下 #include // 标准输入输出头文件 stdio.h int main(void) // main 函数,vo ...

  3. java高级用法之:在JNA中使用类型映射

    文章目录 简介 类型映射的本质 TypeMapper NativeMapped 总结 简介 JNA中有很多种映射,library的映射,函数的映射还有函数参数和返回值的映射,libary和函数的映射比 ...

  4. c+智能指针源码分析_C ++中的智能指针

    c+智能指针源码分析 In this article, we'll take a look at how we can use Smart Pointers in C++. 在本文中,我们将研究如何在 ...

  5. c语言 char* 参数,深入理解c语言中两级指针(char **pptr)的参数的用法

    /**/##*msgg[]={"","","","","","","S ...

  6. c语言char转wchar t,c语言char和wchar_t 转换

    最近遇到一个在C语言当中处理中文的问题,因为汉字和ascii不同,汉字是多字节编码方式,ascii只用一个字节表示,所以在用c语言提供的strlen函数得到的长度是字节长度; 以下都是utf-8编码方 ...

  7. c语言atan2函数赋值程序,C/C++中的atan和atan2函数实例用法

    在C语言的math.h或C++中的cmath中有两个求反正切的函数atan(double x)与atan2(double y,double x) 他们返回的值是弧度 要转化为角度再自己处理下. 前者接 ...

  8. c语言char赋给int,c语言 char 复制给 int的问题

    今天在写代码的过程中对一个函数进行了重构,函数的用处是将一块内存中的内容打印成16进制表示的字符串:很悲哀的输入的是一个char指针:char* buffer:当调用Format("%02X ...

  9. c语言程序中只能给指针赋,在c程序中,只能给指针变量赋NULL值和_____值. 答案:地址;指针...

    相关问题 : 宋代,诗人,陆游,诗,中,纸上, : 分子,离子,中,三角,锥,构型, , : 影视,摄影,中,主人公,视线,位置,镜头,主人公,看视,效果,/p, : 中,内容,数值,公式,IF,IF ...

最新文章

  1. 便利的开发工具 CppUnit 快速使用指南
  2. 激光雷达的地面-非地面分割和pcl_ros实践
  3. Windbg 教程-调试非托管程序的基本命令下
  4. POJ 2492 A Bug's Life 带权并查集
  5. 【复习资料】设计模式
  6. React Native 第六天
  7. ajax创建对象,ajax创建对象
  8. Android App包瘦身优化实践
  9. 最新版MySQL在MacOS上的实践!
  10. stm32 Keil编译后查看代码/内存占用空间,Flash/RAM占用大小,Code-Data,RO-Data,RW-Data,ZI-Data是什么含义
  11. 【第二组】项目冲刺(Beta版本)第五次每日例会 2017/7/23
  12. [转][Err] 1452 - Cannot add or update a child row: a foreign key constraint fail
  13. kx linux驱动下载,创新5.1声卡驱动kX Project Audio DriverV5.1免费版下载 - 下载吧
  14. 审计专业毕业论文有什么好写一点的论文选题吗?
  15. html 动态文本框的值,HTML Javascript动态添加和删除文本框
  16. 泉州有了一个水务大脑,用AI守护“绿水青山”
  17. LiDAR 4 固态激光雷达 (Flash LiDAR)
  18. C语言微信控制windows电脑代码,Windows电脑版微信实现多开 无需第三方软件(bat命令实现)...
  19. 神经系统的解剖学基础是,神经系统系统解剖学
  20. jnz和djnz_第3章单片机指令系统_练习

热门文章

  1. apache camel_Apache Camel日志组件示例
  2. java8 函数式编程_Java 8函数式编程:延迟实例化
  3. lock.lock_HibernateCascadeType.LOCK陷阱
  4. angular8 rest_带有Angular JS的Java EE 7 – CRUD,REST,验证–第2部分
  5. 扩展枚举功能的两种方法
  6. 无法加载可扩展计数器_多核可扩展计数器
  7. 使用Dropwizard度量标准监视和测量无功应用
  8. jpa 关系拥有方_JPA:确定关系的归属方
  9. Java 9模块系统(拼图)@ LJC的HackTheTower
  10. spring hsqldb_在Spring中嵌入HSQLDB服务器实例