指针学习(特殊指针)

简介: 指针学习(特殊指针)

1.char型指针

char型指针实质上跟别的类型的指针并无本质区别,但是C语言中的字符串以字符数组的方式存储,而数组在大多数场合又会表现为指针,因此字符串在绝大多数场合就表现为char型指针。


例如:


char *p = "abcd";

2 .多级指针

如果一个指针变量 p1 存储的地址,是另一个普通变量 a 的地址,那么称 p1 为一级指针

如果一个指针变量 p2 存储的地址,是指针变量 p1 的地址,那么称 p2 为二级指针

如果一个指针变量 p3 存储的地址,是指针变量 p2 的地址,那么称 p3 为三级指针

以此类推,p2、p3等指针就被称为多级指针

int a = 100;
int   *p1 = &a;  // 一级指针,指向普通变量
int  **p2 = &p1; // 二级指针,指向一级指针
int ***p3 = &p2; // 三级指针,指向二级指针

注:一维数组可以看作一级指针,那么二维数组是否能作为二级指针?


其实二维数组和二级指针没有太大关系


例如


int a[3];
// 此处的a等价于 &a[0],而a[0]是一个int,因此此处a的类型是 int (*)//即int类型的指针
int *p = a+1;
int a[2][3];
// 此处的a等价于 &a[0],而a[0]是一个int[3],因此此处a的类型是 int (*)[3]//指向一维数组的指针
int (*p)[3] = a+1;
int *a[3];
// 此处的a等价于 &a[0],而a[0]是一个int *,因此此处a的类型是 int (*)*指向一级指针的指针,即二级指针
int **p = a+1;

注:如果不理解:int(*p)[3]和int *p[3]


可以看这两篇


http://t.csdn.cn/k9ebe


http://t.csdn.cn/w0dxx


3. void型指针

void指针就是无法明确指针所指向的数据类型时,可以将指针定义为 void 型指针

要点:


void 型指针无法直接索引目标,必须将其转换为一种具体类型的指针方可索引目标

void 型指针无法进行加减法运算

void关键字的三个作用:


修饰指针,表示指针指向一个类型未知的数据。

修饰函数参数列表,表示函数不接收任何参数。

修饰函数返回类型,表示函数不返回任何数据。

注:int* 是类型说明
()是强制转换运算符
(int *)a是表示把a强制转换成一个int型的指针
*(int *)a就是取a指向的内容的意思,跟*a的*作用一样
// 指针 p 指向一块 4 字节的内存,且这4字节数据类型未确定
void *p = malloc(4);
// 将这 4 字节内存用来存储 int 型数据
*(int *)p = 100;
printf("%d\n", *(int *)p);
// 将这 4 字节内存用来存储 float 型数据
*(float *)p = 3.14;
printf("%f\n", *(float *)p);


4. const型指针

const型指针有两种形式:①常指针 ②常目标指针

1.常指针:const修饰指针本身,表示指针变量本身无法修改。



2.常目标指针:const修饰指针的目标,表示无法通过该指针修改其目标。



常目标指针在实际应用中广泛可见,用来限制指针的读写权限


int a = 100;
int b = 200;
// 第1中形式,const修饰p1本身,导致p1本身无法修改
int * const p1 = &a; 
// 第2中形式,const修饰p2的目标,导致无法通过p2修改a
int const *p2 = &a;
const int *p2 = &a;

5 .函数指针

函数指针跟普通指针本质上并无区别,只是在取址和索引时,取址符和星号均可省略


例如


void   f (int); // 函数 f 的类型是: void (int)
void (*p)(int); // 指针 p 专门用于指向类型为 void (int) 的函数
p = &f; // p 指向 f(取址符&可以省略)
p =  f; // p 指向 f
// 以下三个式子是等价的:
  f (666); // 直接调用函数 f
(*p)(666); // 通过索引指针 p 的目标,间接调用函数 f
 p (666); // 函数指针在索引其目标时,星号可以省略


目录
相关文章
|
存储 C语言 C++
C语言学习系列-->看淡指针(3)
C语言学习系列-->看淡指针(3)
47 0
|
2月前
|
C语言
学习——理解指针(4)(指针学习最后一节)
学习——理解指针(4)(指针学习最后一节)
|
2月前
|
存储 C++
学习——理解指针(3)
学习——理解指针(3)
|
2月前
|
编译器
学习——理解指针(2)
学习——理解指针(2)
|
2月前
|
存储
学习——理解指针(1)
学习——理解指针(1)
|
5月前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
6月前
|
存储 C语言
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)一
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)一
56 1
|
6月前
|
存储 C语言
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)二
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)二
44 1
|
C++
C++语言学习指针和引用应用案例
C++语言学习指针和引用应用案例
78 1

热门文章

最新文章