指针
1.指针就是一个变量的地址
`int *p; //一个指向整型的指针 p才是指针`
`p=&a; //p指向a p是a的地址`
`a=12 *p也=12`
`scanf("%d",&a);
scanf("%d",&*p);
scanf("%d",p); //P原来就是地址了不用&`
只有相同类型的指针变量才可以相互赋值
定义空指针
int *p = NULL
指针加减
p++ 从现在的地址指向下一个地址 p-- 指向上一个地址
2.指针加减
int *p = &a; 如果 p的值为2000,那么p+2 p的值变为2000+2*sizeof(int)=2000+4 sizeof 统计字节
3.二级指针
`int a,*p,**pp;
a = 2;
p=&a; //p指向a
pp=&p; //pp指向p
*p=2; **pp=2;`
4.指针作为参数
`int main()
{
int a,b;
int *pa,*pb;
void swap(int *p1,int *p2);
scanf("%d %d",&a,&b);
pa = &a;pb = &b;
swap(pa,pb); //swap(&a,&b); 也是可以的 只要参数是地址
printf("%d %d\n",a,b);
printf("%p %p",pa,pb); //%p输出地址
return 0;
}
void swap(int *p1,int *p2)
{
int t;
t = *p1;
*p1 = *p2;
*p2 = t;
}`
5.1指针函数
一定要返回地址
`int *f(int a,int b)
{
//阿巴阿巴
return (&a);
}`
`int *f(int a,int b)
{
int *p;
//阿巴阿巴
return (p);
}`
5.2指向函数的指针
`int main()
{
int a = 2,b = 3;
float(*p)(); // 1.指向函数
float max(int a,int b);
p = max; //2.将函数名赋给p
float s = (*p)(a,b); //3.用指针调用函数 等价于s=max(a,b)
printf("%.2lf",s);
}
float max(int a,int b)
{
return a>b?a:b;
}`
6.数组与指针
6.1一维数组 数组名是该数组的首地址 int a[10] a表示a[0]
`int a[10]; 元素a[i]的地址为a+i a[i]用指针表示*(a+i)
int *p;
p=a 和p=&a[0]等价
p++ p指向a[1] `
`int main()
{
int a[5];
for(int i = 0;i < 5;i++)
scanf("%d",a+i); //a+i为第i个元素的地址
for(int i = 0;i < 5;i++)
printf("%d ",*(a+i));
int *p = a;
for(p=a;p < a+5;p++)
printf("%d ",*p);
}`
6.2二维数组与指针
` a[0]表示第一行的首地址 也是a[0][0]的地址 a[0]等价于*(a+0)
a[i][j]的地址可以表示为a[i]+j或者*(a+i)+j
元素值表示*(a[i]+j) *(*(a+i)+j)//第几行第几列
*a==a[0]
*a[0]==a[0][0]
**a==a[0][0]`
6.3行指针
`int (*p)[5];//定义一个行指针p p可以指向一个有5个元素的一位数组
int a[3][5];
p=a;//p指向第0行首地址 p+1指向第一行首地址`
6.4指针数组
`int *p[10];//有10个指针变量 可以指向整型
char *p[3];//有3个元素 每个元素可以指向一个字符数组或者字符串
char *p[3]={"abc","asd","zxc"};//p[0]指向abc p[1]指向asd p[2]指向zxc`
7、字符串与指针
`char c[10]//*(c+i)表示第i个字符的地址`
`char a[]="computer";
char *p;
p=a;
printf("%s %s",p,a);//两个都是输入computer p为首地址系统输出一个字符后自动执行p++直到遇到“\0”结束`