1:指针定义格式:
格式:变量类型 *变量名用途:指针变量用于储存地址(only),也就是根据地址值,访问对应的存储空间。
注意。int *p 只能指向int类型的数据;
例: int a = 20; int *p; p = &a; //既p代表地址,*p代表值 //这时的* 代表指针变量p指向的存储空间,目的:改变p代表的地址指向的空间。
任何指针类型,都是占用8字节的存储空间。
指针的长度,是要根据指向的数据的地址,来取多少长度的数据,所以为防止取错数据需要和指向数据的类型一致。
注意:指针+1:p+1-->调到下一个地址,并非数学意义上的+1 具体取决于定义的类型,如: int:+4,char:+1,double:+8;
指针数组:
int age[5]
int *p;
p = age;
数组赋给指针,可指针也具有数组的特性
p[i],
下面的上下情况一样的,
void change(int *array){ }
void changge(int array[]){ }
利用指针接收一个数组,指针变量arry指向数组的首元素。
3:指针与字符串
char name[] = "it"; char *name2 = "it"; //name2指向字符串的首字符, 由于其是char类型的数据,则只能指向第一个char类型。 printf("%c ",*name2); -->i 指针name2就是代表了字符串的首字符 printf("%s ",name2); -->it 而输出格式%s代表着,他会一致从第一个地址开始输出,知道遇到 结束。
知道了指针的基本用法后,定义字符串的就有两种方式:
char name[] = "it"; char *name2 = "it"; name[1]='A';-->OK *name='A',-->出错。 原因:指针定义的字符串,不可更改, 区别:数组:字符串变量(可更改) 指针:字符串常量(不可更改) char *n1="it"; char *n2="it"; printf("%p %p ",n1,n2);//查看%p查看地址 二者的结果是一样的。指向同一个地址 **指针数组与指针字符串的区别 char name[]="itcast"; 特点:在变量区,内容可以更改 使用场合:字符串的内存需要经常修改 指针字符串 char *name="itcast"; 特点:这个字符串其实是常量字符串(在内存的常量区),里面的字符是不可更改。 使用场合,字符串的内存需要不需要修改,而且是经常用到。
3:指针数组
char *name[5]={"jack","rose","jael"};
等价与二维字符串数组(字符串数组)
char name[3][5]={"jack","rose","jael"};
4:指向函数的指针
指针用来指向地址,而函数也有地址,指针也可以用来指
我们知道数组名,代表数组的地址 ,同样,函数名代表函数地址。
//无返回值,无参 void test(){ } //带返回值 int sum(int a,int b){ return a+b; } //带返回值,同事参数也有指针格式 double min(double a,char *s,int a){} int main(){ //1,使用void //(*p):固定格式 //左边的void:指针变量p指向的函数没有返回值 //右边的():代表p指向的函数没有形参 void (*p)(); p = test;//指针变量p指向test (*p)()://调用test函数, 或者p(); //2,带返回值int类型 int (*p)(int a,int b)//int (*p)(int,int) p = sum; int c = p(4,5); return 0; } //3,double格式 double (*p)(double,char *,int); p=min; //或者 double (*p)(double,char *,int)=min;
作者:Darren
微博:@IT_攻城师
github:@Darren90