C学习笔记(九)指针

来源:互联网 发布:数控折弯机怎样编程 编辑:程序博客网 时间:2024/06/16 04:54

一.定义与初始化

1.1.如何理解指针?

指针是一个变量,保存的是地址

指针的字节长度固定为4个字节

 

1.2.定义指针的几种规范

int  *p;

int  *  p = & num;

 

二.* 与& 运算符详解

2.1. 指针的类型和指针所指向的类型

指针的类型
  从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型: 
  (1)int*ptr;  //指针的类型是int* 
  (2)char*ptr;  //指针的类型是char* 
  (3)int**ptr;  //指针的类型是int** 
  (4)int(*ptr)[3];  //指针的类型是int(*)[3] 
  (5)int*(*ptr)[4];  //指针的类型是int*(*)[4] 

 

指针所指向的类型

当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。 
  从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如: 
  (1)int*ptr;//指针所指向的类型是int 
  (2)char*ptr;//指针所指向的的类型是char 
  (3)int**ptr;//指针所指向的的类型是int* 
  (4)int(*ptr)[3];//指针所指向的的类型是int()[3] 
  (5)int*(*ptr)[4];//指针所指向的的类型是int*()[4] 

 

对指针的操作,会因为它指向的类型不一样而有所区别,最简单的
char *p  如果p+1,那么就是加一个字节(步长为一个字节)

int *p 如果p+1,那么就是加一个sizeof(int)=4字节(步长为四个字节)

 

 

2.2.指针的值

指针的值也被称作指针所指向的内存区或地址,在32位程序里,指针的值都是一个32位整数,因为32位程序中的内存地址都是32位长。

指针指向的内存空间

指针对应的内存空间

 

num++: num对应的内存空间的值加1     0x1000    0x1001

p++: p对应的内存空间的值加1(步长为4    0x1000     0x1004

*p++ :根据p对应的内存空间保存的地址找到其对应的内存空间

          对其指向的内存空间的值加1      0x1000    0x1001

 

2.3. 二维指针 多维指针

一维指针保存的是基本变量的地址,二维指针保存的是一维指针的地址

多维指针 远指针:超过二维的指针

等式转化

num = *p = **pp = ***ppp = *( &num )

&num = p = *pp = **ppp

 

 

三.指针运算

3.1.指针的赋值运算

3.1.1空指针

空指针,不指向任何对象的指针,空指针的值为NULL,NULL可能是0,0L,或是(void *)0

 

空指针的使用

①  用空指针结束对递归数据结构的间接引用

②  用空指针表示函数调用失败的返回值

③ 用空指针做警戒值

 

3.1.2野指针(见上一篇po

1.野指针导致内存泄漏岸

2,.如何避免野指针?

3.动态分配内存(见下一篇po

malloc

calloc

ralloc

 

3.1.3指针变量之间的赋值

 

1.不同指针类型变量赋值导致的问题

只有相同类型的指针变量才可以进行赋值,因为不同类型的指针步长不同,所以不同指针类型变量赋值会导致问题。

当步长长的指针赋值给步长短的指针(int*    char*)

会导致数据获取不完整

当步长短的指针赋值给步长长的指针(char*    int*)

会导致越界指向非法内存

 

2.void* 万能指针

Void 一般被称为通用指针或泛指针

Void指针指向一个对象,但该对象不属于任何类型

Void指针适用场合:

①   进行纯粹的内存操作时(memcpy)

②   传递一个指向未定类型的指针

③   函数指针

 

此处注意辨析strcpymemcpy的区别

char *strcpy(char *str1,const char *str2);

void *memcpy(void *dest, const void *src, size_t n);

strcpy将一个字符串复制到另一个字符串中

memcpy使用了void指针,只进行纯粹的内存复制,包括NULL字符在内的任何内容都将被复制

 

3.2指针的算术运算

3.2.1指针+- 整数

ptr = ptr + 1;  \\指针跳一个步长

3.2.2指针 - 指针

     减法运算的值是两个指针在内存中的距离(以数据元素的长度为单位,不是以字节为单位)

0 0
原创粉丝点击