指针的运算:
1、指针 + - 整数:向前或者向后跳n个元素。
2、指针 - 指针 : 得到指针和指针之间的元素的个数,但不是所有的指针都能相减,指向同一块空间的指针才能相减(其实也不是不能减,只是没有意义)。
这里也提供了一个新的求字符串长度的方法
标准规定,允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
对于大多数编译器,进行大小比较时,数组向前或者向后越界一个元素都是可以顺利完成任务的,但最好不要向前访问第一个元素之前的那个元素,因为标准并不能保证它可行。
指针和数组:
这里好像也有个比较好玩的点,指针变量是可以使用 [ ] 的。
如果在sizeof()里面使用 +1 ,那么arr就不再代表整个数组,而变成了一个元素
二级指针:
二维数组好像也可以,第一个 [ ] 好像是解引用ppa ,第二个 [ ] 是解引用 *ppa,开始离谱了,
[ ]的数就是指以当前地址位起点,向后移动几位开始解引用。
指针数组:
这里后面那个parr [ i ] [ i ] 就打印错了,应该是第一个[i] 解引用找到了a,b,c的地址,第一次 i 是 0 ,所以就之间解引用的&a,而当 i =1,2的时候,在解引用找到了b,c的地址,有分别向后移动了1位和2位,才解引用,所以打印的效果是这个样子的
从这里对比打印的地址,也可以证明上面的猜测,还不错。
这里可以看出,如果对于指针数组进行不完全初始化的话,系统会在后面默认补 NULL,和数组补 0 一个道理好像。
指针数组甚至还可以这样用,不过这里如果用上面的来理解,其实还好,因为数组arr1,arr2,arr3它们内部的几个元素地址都是连续的,在第一个 [i] 解引用找出来 arr1,arr2,arr3的首地址之后,再向后移动 j 位,自然打印的就是第几个元素了,所以这样看确实可以,可以和图二对比下。
从上面这些东西,也可以稍微感觉到指针和数组可以玩的很花,不过感觉主要是指针可以玩的很花。
结构体:
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
注意结构体的声明大括号后面有分号。