内容: 注意: 数组名是搜元素的地址 就算是用数组接受,本质上接受的还是地址 地址就是指针,指针的大小取决于32位平台还是64位平台 但是int类型的数组元素的大小就是int类型的 所以sz有两种可能1(32位平台)或2(64位平台) 初阶指针内容 一,字符指针 用法一: 用来存放字符变量的地址 用法二: 打印字符数组内容 直接用%s加数组首元素地址即可 根据字符串数组地址找到存储的内容,用%s打印字符串内容 pc里面存放的正是数组首元素地址所以可以直接pc 用法四: 指针变量中储存的是字符a的地址(即字符串的首字符地址) 分析: 指针里存储的是字符串的首字符地址 根据这个字符串的首字符地址找到存储的内容 根据这个存储的字符串内容进行打印 注意: 这种写法是错误的 指针里存储的是字符串的首字符地址 将指针内容改成别的字符地址 那根据改变后的地址将找不到之前的字符窜 最好加上const 如果进行p变量的修改时会报错 推荐两个技术问答社区的网站 推荐一本特别经典的书: 《剑指offer》 牛客网的剑指offer的编程题 重要例题讲解: 输出的是haha不是hehe 两个数组是不同的空间进行存储的,所以两个数组的首元素的地址是不同的 输出的是hehe不是haha 两个常量字符串一模一样,不能进行修改,所以abcdef是用同一块空间存储的 两个指针指向的都是这块空间中a的地址 所以指针p1 , p2 中储存的地址相同 分析: 好的代码习惯: 将存储字符常量的变量前加个const 总结: 1.常量字符串不可修改,存储在一块空间中 2.存储在变量里的字符串可以修改,存储在不同的空间中 3.字符存放在字符数组中的是可以修改的,每个字符存放在相应的字符变量所对应的空间中 4.而存放在字符指针中是不可修改的,是常量字符串,指针里存储的是字符串的首字符地址 二,指针数组 []的优先级要高于* 所以int* parr[10];为指针数组 定义指针数组变量的时候,[10]说明parr是数组,*说明这个数组是指针,数组的元素个数是10个,int*说明数组的每个指针变量的类型是int* 注意: arr存放的是数组首元素的地址 指针数组存放的是相同类型变量的地址 指针数组的使用: 方法一:(不常用) 方法二:(实现多维数组) 结果: 分析: 三,数组指针 指向数组的指针 &arr存放的是整个数组的地址 []的优先级要高于* 所以int* parr[10];为指针数组 int(*parr)[10];为数组指针 定义变量的时候,*说明parr是指针[10]说明是数组,数组的元素个数是10个,int说明指针指向的数组的类型是int 解析: 总之: &arr和arr的区别主要是: 数组指针的使用: 方法一:(不常用) 方法二: 参数是数组的形式 最常见的一种方式,打印二维数组 解析: 参数是指针的形式 将二维数组arr想象为一个一维指针数组 存放的是二维数组每一行的首元素的地址, 传参的时候传递的是第一行的首元素的地址 根据p+i找到每一行的首元素地址 *(p+i)加一颗*表示,指向每一行的首元素地址后面的内容,相当于知道了一维数组首元素的地址 (*(p+i)+j)相当于根据每一行的首元素地址向后指向每一行中后面的地址 *(*(p+i)+j)解引用操作,根据地址找到地址所指向的内容 相当于(*(p+i))[j] 因为: 类比推得: 总结: 分析: int(*)[5]是数组类型 parr3[10]是一个有10个元素的数组,每一个元素都指向一个有5个int类型元素的数组