C语言_二级指针
理解各级指针+1的含义
typename* p;
p = p + 1; 被编译器解释成: p = p + sizeof(typename)*1;
int型为例
1 | int a3,a2,a1,a0; |
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字节,使二级指针指向了下一个元素,即二级指针指向了下一个一级指针。加后的类型依旧是二级指针。
*s+1
*s+1实际上是*s+4字节,因为int型占4字节。意义就是使一级指针指向了下一个元素,即一级指针指向了下一个int型数据。加后的类型依旧是一级指针。
**s+1
**s+1实际上就是表面意思**s+1,因为**s为int型数据,而不是二级指针也不是一级指针,是实实在在的数据本身。则意义就是int型数据的加法运算。加后的类型为int型。
char型为例
s+1
s是一个二级指针,类型为char**,只要是x86架构下的指针,不管几级,都是占用4字节。
则根据上文,s+1的意义就是,实际是s+4字节,使二级指针指向了下一个元素,即二级指针指向了下一个一级指针。加后的类型依旧是二级指针。
*s+1
*s+1实际上是*s+4字节,因为char型占1字节。意义就是使一级指针指向了下一个元素,即一级指针指向了下一个char型数据。加后的类型依旧是一级指针。
**s+1
**s+1实际上就是表面意思**s+1,因为**s为char型数据,而不是二级指针也不是一级指针,是实实在在的数据本身。则意义就是char型数据(本质上是ASCII码整型值)的加法运算。加后的类型为char型。
double型为例
s+1
s是一个二级指针,类型为double**,只要是x86架构下的指针,不管几级,都是占用4字节。
则根据上文,s+1的意义就是,实际是s+4字节,使二级指针指向了下一个元素,即二级指针指向了下一个一级指针。加后的类型依旧是二级指针。
*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]数组。 |