11、 数组与指针:
指针的类型决定了指针的操作规则。int *p1 指针*p1一次操作4字节空间,float* p2指针*p2一次操作 4字节空间,double* p3指针*p3一次操作8字节空间
指针可以进行加减运算,且只能进行加减运算,名字叫指针的偏移。加减n,实为加减n个类型的大小。
p1+1 1为sizeof(int) 4
p2-2 2为sizeof(float)*2 8
p3+3 3为sizeof(double)*3 24
12、一维数组与指针
一维数组int a[5]={1,2,3,4,4}每个元素类型都是一样的,且空间是连续的。
&a[0]+1==&a[1]
&a[0]+2==&a[2]
&a[4]-1==&a[3]
每个元素都是int类型的,可以用指针装地址。
int *p=&a[0];
则:
p+0==&a[0] a[0]==*&a[0]==*(p+0)==*p
p+1==&a[1] a[1]==*&a[1]==*(p+1)
p+2==&a[2] a[2]==*&a[2]==*(p+2)
p+3==&a[3] a[3]==*&a[3]==*(p+3)
p+4==&a[4] a[4]==*&a[4]==*(p+4)
注意:*(p+1)一定要加小括号,因为加法的优先级低于*。
*(p+1) 先执行p+1为&a[1],再取*,为a[1], 成为具体的值。
*p+1先执行*p,若为具体的值是8,再+1为9。
13、数组的属性:数组名是首元素的的首地址:&a[0]==a。
int *p=&a[0];、
int *p =a;
二者一摸一样,平时都是用第二种的。
14、下标运算符:[]
*(p+4)==p[4]==4[p]。
15、一维数组指针:
数组是一个变量,它里面有很多小元素,对元素取地址,得到的是元素地址,对数组名取地址,得到的是数组的地址,又称数组指针(地址)。
int a[5]={123,13,56,32,4};
int (*p)[5]=&a; //p就是一维数组指针变量
类型思路:int[5]是数组类型,指针指向它,int[5]*p,但 c语言要求写成int(*p)[5],必须加上小括号,不加int*p[5]就是指针数组,因为[]的优先级要高于*,先跟*结合,p就是指针,先跟[]结合,p就是数组。
注意:&a与&a[0]数值一样,类型不一样,进行+1,&a是数组的地址,+1加的是整个数组的大小,&a[0]是数组中首个元素的地址,+1是加一个元素的大小。(因为首元素地址与整个数组的地址重合)。