1、区别:
- 传递地址直接访问内存空间地址,如果修改对应的地址空间的数值,再次访问时数值发生变化
2、
- 变量的操作:
1、对变量的操作 - 指针变量的操作:
2、只对对内存空间的操作
3、对内存空间的存放的数据进行操作
一、形式参数传递变量的数值
code:demo1.c
#include<stdio.h>
void pointerChangData(int data1, int data2)
{
int temp;
temp = data2;
data2 = data1;
data1 = temp;
}
int main(void)
{
int data1=1, data2=99;
printf("交换之前数据的值:%d, %d\n", data1, data2);
pointerChangData(data1, data2);//传递的参数是数值
printf("交换之后数据的值:%d, %d\n", data1, data2);
return 0;
}
运行结果:结果不交换
交换之前数据的值:1, 99
交换之后数据的值:1, 99
二、 形式参数传递地址
code:demo2.c
#include<stdio.h>
void pointerChangData(int *pdata1, int *pdata2)
{
int *temp;
temp = pdata2;
pdata2 = pdata1;
pdata1 = temp;
printf("temp:%p\n", &temp);
printf("pdata1:%p\tpdata2:%p\n", pdata1, pdata2);
}
int main(void)
{
int data1=1, data2=99;
printf("data1:%p data2:%p\n", &data1, &data2);
printf("交换之前数据的值:%d, %d\n", data1, data2);
pointerChangData(&data1, &data2);
printf("交换之后数据的值:%d, %d\n", data1, data2);
return 0;
}
运行结果:交换内存地址空间,数值没有改动
data1:000000000061FE4C data2:000000000061FE48
交换之前数据的值:1, 99
temp:000000000061FE08
pdata1:000000000061FE48 pdata2:000000000061FE4C
交换之后数据的值:1, 99
code:demo3.c
#include<stdio.h>
void pointerChangData(int *pdata1, int *pdata2)
{
int temp;
temp = *pdata2;
*pdata2 = *pdata1;
*pdata1 = temp;
printf("pdata1:%p\tpdata2:%p\n", pdata1, pdata2);
}
int main(void)
{
int data1=1, data2=99;
printf("data1:%p data2:%p\n", &data1, &data2);
printf("交换之前数据的值:%d, %d\n", data1, data2);
pointerChangData(&data1, &data2);
printf("交换之后数据的值:%d, %d\n", data1, data2);
return 0;
}
运行结果:直接反问内存地址空间,对里面的数值进行修改,再次访问数值发生改变。
data1:000000000061FE4C data2:000000000061FE48
交换之前数据的值:1, 99
pdata1:000000000061FE4C pdata2:000000000061FE48
交换之后数据的值:99, 1
错误的代码操作
再挣扎一下
#include<stdio.h>
int* pointerChangData(int *pdata1, int *pdata2)
{
int a = 1000;
int b = 9999;
pdata1 = &a;
pdata2 = &b;
//printf("交换之后数据的值:%d, %d\n", *pdata1, *pdata2);
return pdata1;
}
void pointerChangData1(int *pdata1, int *pdata2)
{
*pdata1 = 1000;
*pdata2 = 9999;
}
void pointerChangData2(int *pdata1, int *pdata2)
{
int *temp;
temp = pdata2;
pdata2 = pdata1;
pdata1 = temp;
printf("temp:%p\n", &temp);
}
int main(void)
{
int data1=1, data2=99;
printf("data1:%p data2:%p\n", &data1, &data2);
printf("交换之前数据的值:%d, %d\n", data1, data2);
//传递地址过去,如果想要改变地址的内存空间,需要对应返回return 地址回来;
pointerChangData(&data1, &data2);
/* 传递地址过去,地址相当于我家(原本是还没有装修的),
pointerChangData1,函数,让装修工对我家进行装修修改,样子是变了,
位置地址还是那个,没变
*/
printf("交换之后数据的值:%d, %d\n", data1, data2);
printf("data1:%p\tdata2:%p\n", &data1, &data2);
return 0;
}
/*
int main(void)
{
int *data;
int *data0;
int data1=1, data2=99;
printf("data1:%p data2:%p\n", &data1, &data2);
printf("交换之前数据的值:%d, %d\n", data1, data2);
data = pointerChangData(&data1, &data2);
//一个指针的地址无法给一个数据类型(int,char,float...)
data1 = *data;
//这里打印的还是data1和data2的n内存地址的数值,
//只要对data1和data2的地址进行数值改变就会发生变化
printf("data1:%p data2:%p\n", &data1, &data2);
printf("交换之后数据的值:%d, %d\n", data1, data2);
return 0;
}
*/
解释: