1.指针基础
指针的大小与级别 类型均无关,只与操作系统(x86 4字节 x64 8字节)有关
int a=10; int* p=&a;//一级指针 int** s=&p;//二级指针 *p=20;//此时a=20(解引用) **s=30;//此时a=30(解引用)
例题:
int a = 1, b = 2; int *p = &a; int *q = &b; *p = 10; *q = 20; int **s = &p; int **t = &q; s = &q; t = &p; **s = 3; **t = 4; *s = *t; **s = 6;//最终a=6,b=3
*的含义
1)指针的定义:类型*名称
2)解引用:*变量;
3)乘法运算:数据*数据;
3.形参的改变要想改变实参的值必须:1.传指针 2.解引用
指针替换函数:
void swap(int *p,int *q)//a,b替换函数
{int temp;
temp=*p;
*p=*q;
*q=temp;
}
int main()
{int a=10,b=20;
swap(&a,&b);
printf("%d,%d",a,b);
}
数组中数字替换:
void swap(int *arr,int p,int q)
{int num=arr[p];
arr[p]=arr[q];
arr[q]=num;
}
int main()
{int arr[]={1,2,3,4,5};
int p=2,q=3;
swap(arr,p,q);
}
解引用:arr[0]具有解引用的功能
*arr<=>*(arr+0) arr[2]=*(arr+2)
类型对指针变量的两个作用:
1)解析存储单元大小
2)指针变量加1的能力
2.指针和数组的关系
int arr[]={1,2,3,4};
int *p=arr;//arr代表数组元素首地址,p<=>arr
p+1<=>&arr[1];
*(p+1)<=>arr[1]<=>*&arr[1];
&*p<=>arr<=>&arr[0];
“*”与“&”的理解:
例如:
int a=10;int *pa=&a;
*&a可以理解为*(&a),&a表示取变量a的地址(等价于pa),*(&a)表示取这个地址上的数据,即*pa,也就是a;
&*pa可以理解为&(*pa),pa表示a的地址,*pa即取pa指向的值(a),&(*pa)即是取a的地址,也就是pa;
*&pa可以理解为*(&pa),(&pa)表示取pa的地址,*&pa表示取(&pa)上的数据,也就是pa本身;
数组+整型能力强转:
数组名即为数组首元素的地址,指针+1即为加一个单元格,单元格的大小取决于指向的元素类型,
int arr[5]={1,2,3,4,5}
int *p=arr;
char *q=(char*)p;
double *m=(double*)p;
long long *l=(long long*)p;
printf("%d",*(p+1));//输出结果为2,p+1一次增加一个单元格,int 一次增加四个字节
printf("%d",*(q+1));//输出结果为0,char型,一次增加一个字节,
printf("%d",*(m+1));//输出结果为3,double型一次增加八个字节,即为两个单元格
printf("%d",*(l+1));//输出结果仍然是3,longlong型一次增加八字节,同上double
printf("%llx",*(l+1))//结果为4000000003,具体原因为内存的空间分配,
再如上代码的前提下,
p<=>arr<=>&arr[0], (p+1)<=>&arr[1] (p+2)<=>&arr[2]
*p<=>arr[0] *(p+1)<=>arr[1] *(p+2)<=>arr[2]



