C语言_二级指针

理解各级指针+1的含义

typename* p;
p = p + 1; 被编译器解释成: p = p + sizeof(typename)*1;

int型为例

image-20210731140231534

1
2
3
4
5
6
7
int a3,a2,a1,a0;
int *p3,*p2,*p1,*p0;
int **s;
s+1;
*s+1;
**s+1;
//以上三句:1、加1的意义是什么?2、加后的类型是什么

s+1

s是一个二级指针,类型为int**,只要是x86架构下的指针,不管几级,都是占用4字节。

而指针+1我们要理解其含义,指针+1等效于(指针+sizeof(*指针))。

如果是二级指针+1,则加的大小是一级指针的大小。则不管typename** p; p的类型无论如何,p+1都是加4。

如果是一级指针+1,则加的大小是指向的数据类型的大小,不同数据类型的大小不一样,int型正好和指针的大小一样都是4字节,所以容易造成混淆;char型占1字节。所以int* ip; ip+1为+4;所以char* cp; cp+1为+1。

则s+1的意义就是,实际是s+4字节,使二级指针指向了下一个元素,即二级指针指向了下一个一级指针。加后的类型依旧是二级指针。

image-20210731140336842

*s+1

*s+1实际上是*s+4字节,因为int型占4字节。意义就是使一级指针指向了下一个元素,即一级指针指向了下一个int型数据。加后的类型依旧是一级指针。

**s+1

**s+1实际上就是表面意思**s+1,因为**s为int型数据,而不是二级指针也不是一级指针,是实实在在的数据本身。则意义就是int型数据的加法运算。加后的类型为int型。

char型为例

image-20210731140429617

s+1

s是一个二级指针,类型为char**,只要是x86架构下的指针,不管几级,都是占用4字节。

则根据上文,s+1的意义就是,实际是s+4字节,使二级指针指向了下一个元素,即二级指针指向了下一个一级指针。加后的类型依旧是二级指针。

image-20210731140336842

*s+1

*s+1实际上是*s+4字节,因为char型占1字节。意义就是使一级指针指向了下一个元素,即一级指针指向了下一个char型数据。加后的类型依旧是一级指针。

**s+1

**s+1实际上就是表面意思**s+1,因为**s为char型数据,而不是二级指针也不是一级指针,是实实在在的数据本身。则意义就是char型数据(本质上是ASCII码整型值)的加法运算。加后的类型为char型。

double型为例

image-20210731140641462

s+1

s是一个二级指针,类型为double**,只要是x86架构下的指针,不管几级,都是占用4字节。

则根据上文,s+1的意义就是,实际是s+4字节,使二级指针指向了下一个元素,即二级指针指向了下一个一级指针。加后的类型依旧是二级指针。

image-20210731140336842

*s+1

*s+1实际上是*s+8字节,因为double型占8字节。意义就是使一级指针指向了下一个元素,即一级指针指向了下一个double型数据。加后的类型依旧是一级指针。

**s+1

**s+1实际上就是表面意思**s+1.0,因为**s为double型数据,而不是二级指针也不是一级指针,是实实在在的数据本身。则意义就是double型数据的加法运算。加后的类型为double型。

反观数组指针

首先区分一个概念,即int* s[4];的意义是s是存放int型指针的数组。而int(*s)[4];的意义是s是存放int[4]数组的指针,类似于int[4]* s.

1
int(*s)[4];//意义是s是存放int[4]数组的指针,类似于int[4]* s,则s是指向一个int[4]数组。