指针可以访问数组中的元素,数组可以当做指针使用
数组和指针的区别
1.数组名表示的还是整个数组,指针存储的是地址(指针大小为4个字节或者8个字节)
2.数组名是一个常量表示数组首地址,指针是一个变量可以存储首地址,也可以存储其它地址
数组指针:重心放在指针上,他是一个指针存储的是整个数组的地址
格式:
指针类型 (*指针名)[ 数组元素个数 ] // 指针类型为数组地址类型,指向整个数组
int(*p)[ 5 ]; //定义一个指针变量名为p,整个数组有5个元素
指针数组:重心放在数组上,他是一个数组,数组中存放的每一个元素是指针也就是存放的地址
格式:
指针类型 数组名[ 元素个数 ];
指针类型:与数组的定义方式相同,因为数组中的每一个元素为指针类型
二级指针可以和指针数组相互交替使用
二维数组的定义
格式:
一维数组中元素类型 二维数组名[ 二维数组元素个数 ] [ 一维数组元素个数 ]
例:
int a[ 5 ][ 3 ] ;
a+1:二维数组移动一个位置==&a[ 1 ] 移动了12个字节(一维数组中有3个元素每个元素为4个字节)
a[ 0 ]+1:一维数组移动一个位置==a[ 0 ][ 1 ],移动了4个字节
指针与函数
函数中的形式参数为指针,再调用函数时传递地址,可以得到对应空间的地址,通过地址可以访问对应内存空间
格式:
函数类型 函数名(指向类型1 *指针名1,指向类型2 *指针名2)
{
..........
}
调用方法:
函数名(地址1,地址2.....);
函数指针:重心放在指针上,指针存储函数名的地址
定义函数指针格式:
指针指向的数据类型 (*变量名) (参数列表);
例:
int (*p)(10,20);//指针指向的数据类型为一个返回值为int型的函数,函数中的实参为10,20
函数指针的使用
格式:
指针名 = &函数名;
注:将函数名的地址赋值给指针,调用时,指针相当于函数使用。
指针函数:重心在函数,它是一个函数,返回值为指针,指针中存储的为地址
格式:
返回值类型 * 函数名(参数列表)
{
}
调用:
函数名(参数列表);
其它指针:
1.空指针:在内存中0地址是不可用地址,不可以申请0地址来存储变量否则会报错
例:int *p=NULL;
*p=10; //报错
2.野指针:指针存储的地址不明确
例:int *z;
*z=10;//输出指针z对应的内容时报错
3.void万能指针
int *,float *只能存储对应类型的地址
void可以存储任意类型的地址
例:
int *p;
int a;float b;
void *x;
x=&a;指针指向的地址中的元素为整型数据
x=&b;//指针指向的地址中的元素为浮点型数据
p=x;//将他的地址赋值给其它指针
它可以表示一个地址,但是不能取它的值
5.define和typedef
typedef:用一串字符来代替已经有的类型(取小名)
格式:
typedef 旧的名字 新的名字;
define:内容替换,将任意的数据类型可以用自己想要的名字替换
格式:
define 新的名字 旧的名字
注:语句结束没有分号,是原样替换,typedef是替换类型
define可以携带参数
例:
define
格式:
define 新的名字(参数1,参数2...) 旧的名字;
使用方法:新的名字(实参);
例:
define max(a,b) a>b?:a:b //用max替换a>b?:a:b,将参数a,b传过去
int a,b,sum;
define A(a,b) a*b ;
sum=A(1+2,6+2); //sum=15