从零开始的c语言日记day36——指针进阶

一、什么是指针:

指针的概念:1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间。

⒉指针的大小是固定的4/8个字节(32位平台/64位平台)。

  1. 指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限。4.指针的运算。

  • 字符指针

用字符指针吧ch值改掉。

从零开始的c语言日记day36——指针进阶_第1张图片

下面这段程序不能理解为p里放了一个字符串,应该理解把字符串首字符a的地址,赋给了p。%s打印字符串从第一个字符开始一直到斜杠0结束

从零开始的c语言日记day36——指针进阶_第2张图片

从零开始的c语言日记day36——指针进阶_第3张图片

Abcdef/0为常量字符串,并且前面加了const为不可修改状态。所以在内存中只需要存和一份就够了,因为他都已经不可修改了自然是大家都要用这个内容所以才不可修改。所以p1和p2为相同的,打印p1==p2

而第二种是数组类型,因为数组需要向内存申请空间来储存数组里面的元素,所以每用一次都需要申请一次空间,自然arr1和arr2的地址不一样了。

  • 指针数组

顾名思义就是用来存放指针的数组

Int arr[10]整形数组每个元素为【int int int int int int int int int int 】

Char ch[5]字符数组           【char  char  char  char  char   】

Int* arr2[5]存放整形指针的数组【int*  int*  int*  int*  int*  】

Char* arr [ 5]存放字符指针的数组【char*  char*  char*  char*  char*  】

从零开始的c语言日记day36——指针进阶_第4张图片

Parr【】里存了3个数组的首元素地址,当每一个循环则换到下一个元素即数组地址,打印的时候解引用就打印出元素了

从零开始的c语言日记day36——指针进阶_第5张图片

  • 数组指针

数组指针的定义

数组指针是指针?还是数组?答案是:指针。

整形指针: int * pint;能够指向整形数据的指针。浮点型指针:float * pf;能够指向浮点型数据的指针。那数组指针应该是:能够指向数组的指针。

从零开始的c语言日记day36——指针进阶_第6张图片

数组指针——指针——指向数组的指针

整型指针——指向整型的指针

int*

字符指针——指向字符的指针

&数组名和数组名

从零开始的c语言日记day36——指针进阶_第7张图片

此程序不能把数组名理解为首元素地址,因为如果是首元素地址的话sz计算应该是这个地址的大小,但实际结果不是。

  1. 数组名通常表示的都是数组首元素的地址,但是有两点例外,sizeof(数组名)这里的数组名表示整个数组的大小
  2. &数组名,这里的数组名依然表示整个数组,所以&数组名取出的是整个数组的地址。从表面意义上来讲取出的地址是一样的,但是数组总要有个地址所以数组的地址和数组首元素的地址是一个相同的地址,但他们的本质不一样

如果都给他们+1会怎样

从零开始的c语言日记day36——指针进阶_第8张图片

可以看到第大一段和第二大段的结果是一样的,arr表示首元素的地址那么首元素地址为int*类型,int*指针如果+1就是跳过4个字节。

第二段同理,因为两端程序地址是一样的

但是第三大端则是直接跳过了40个字节是整个数组的字节

从零开始的c语言日记day36——指针进阶_第9张图片

怎么让数组指针存放数组的地址?数组的地址也是地址,地址就应该存在指针变量里,所以数组指针就是存放数组的地址,(*p2)就是指针了,而且指向数组,数组里有10个元素所以为[10]。那么存的元素是什么类型,为int类型所以最后的格式为int (*p2)[10]=&arr

你可能感兴趣的:(c语言,学习,监督学习)