一、指针
1、指针初识
指针==地址
*(&a): *为取值运算符,把后面内存地址中的数据取出来
指针变量:存放地址的变量
int *p;*是一个标识符,用来保存别人地址(p = &a)
int main()
{
int a = 100, b = 10; //定义整型变量a,b并初始化
int* p1, * p2; //定义指向整型数据的指针变量p1,p2;
p1 = &a; //把变量a的地址赋给指针变量p1
p2 = &b; //把变量b的地址赋给指针变量p2
printf("a=%d,b=%d\n", a, b); //输出变量a和b的值
printf("*p1=%d,*p2=%d\n", *p1, *p2);
}
运行结果:
a=100,b=10
*p1=100,*p2=10
举例:交换两个数的位置
#include <stdio.h>
void changeData(int *pdata1,int *pdata2)
{
int temp;
temp = *pdata1;
*pdata1 = *pdata2;
*pdata2 = temp;
}
int main()
{
int data1 = 10;
int data2 = 20;
printf("交换前:data1 = %d,data2 = %d",data1,data2);
changeData(&data1,&data2);
printf("交换后:data1 = %d,data2 = %d",data1,data2);
return 0;
}
运行结果:
交换前:data1 = 10,data2 = 20交换后:data1 = 20,data2 = 10
2、指针变量指向数组
#include <stdio.h>
int main()
{
int arr[3]={45,2,3};
int *p;//此处*为标识作用,表示p是一个指针变量
//p = &arr[0];//数组的首地址就是首个元素的地址
p = arr; //数组名就是数组的首地址
printf("首元素是:%d\n",*p);//此处*为运算作用,表示提取指针变量p中的数据
}
3、指针增量与数组的关系
上段代码打印出第0个元素的值,当然还可以打印出其他位置元素的值
printf("0元素是:%d\n",*p);
printf("1元素是:%d\n",*(p+1));
printf("2元素是:%d\n",*(p+2));
不是给地址+1,而是地址的偏移1个类型的字节数,如果是int型,偏移4个字节,如果是char型,则偏移1个字节;
上述打印方法如果数组元素很多就不太靠谱了!怎么遍历?
#include <stdio.h>
int main()
{
int arr[3]={45,2,3};
int *p;//此处*为标识作用,表示p是一个指针变量
//p = &arr[0];//数组的首地址就是首个元素的地址
p = arr; //数组名就是数组的首地址
for(int i = 0;i<3;i++)
{
printf("第%d个元素为:%d\n",i+1,*(p+i));
}
}
使用指针(地址)遍历数组
补充:1、printf("第%d个元素为:%d\n",i+1,*p++);也可以遍历,*与p先结合,访问之后p++
2、记得回到数组首地址
3、指针和数组名有时可以互换
-指针当作数组名,下标法访问
-数组名拿来加,eg:*(arr+1)
不可互换的一点:a++不可行,arr是常量指针,p是指针变量
4、sizeof
int arr[3] = {1,2,3};
int *p = arr;
printf("sizeof arr is %d\n",sizeof(arr));//3*4=12
printf("sizeof arr is %d\n",sizeof(p));//os用8个字节表示一个地址
只要是个指针,就是8个字节