C语⾔基础——指针型函数参数
在C语⾔中,函数的参数不仅可以是整数、⼩数、字符等具体的基本数据类型,还可以是指向它们的指针。⽤指针变量作函数参数可以将函数外部变量的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些修改的数据不会随着函数的调⽤结束⽽被销毁。⽽像数组、字符串、动态分配的内存等都是⼀系列数据的集合,没有办法通过某⼀个参数全部传⼊函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合。
封装交换变量值得函数,然后调⽤,代码如下:
#include<stdio.h>
void exchange(int a, int b) {
int temp = a;
a = b;
b = temp;
}
void main(){
int a=2,b=3;
exchange(a,b);
printf("a=%d,b=%d\n",a,b);
}打印结果:a=2,b=3
可以发现,变量a,b的值并没有改变。那是因为调⽤exchange函数的时候传⼊了变量a和b的值,该函数在⾃⼰的内部重新分配了2个地址空间来存放着两个值,⽽该函数改变的是⾃⼰内部分配的空间的值。并不对外部的变量a,b造成影响。修改代码如下:
#include<stdio.h>
void exchange(int *a, int *b) {
printf("a=%#x,b=%#x\n",a,b);//进⼊函数,打印指针变量a,b所保存的地址
int temp = *a;
*a = *b;
*b = temp;
printf("a=%#x,b=%#x\n",a,b);//完成交换后,打印指针变量a,b所保存的地址
parameter数据类型}
void main(){
int a=2,b=3;
printf("a=%#x,b=%#x\n",&a,&b);//先打印a,b的地址
exchange(&a,&b);
printf("a=%#x,b=%#x\n",&a,&b);//先打印变量a,b的地址,看是否发⽣变化
printf("a=%d,b=%d\n",a,b);//打印变量a,b的值
}
打印结果:
a=0x3bfc54,b=0x3bfc48
a=0X3BFC54,b=0X3BFC48
a=0X3BFC54,b=0X3BFC48
a=0x3bfc54,b=0x3bfc48
a=3,b=2
可以发现完成了交换的功能,并且在交换的过程中变量a,b的地址值始终没有变化。
数组是⼀系列数据的集合,并且定义数组时的变量实际上存放有数组的第⼀个元素的地址,所以这个变量本质上就是⼀个指针。
指针是不可能包含所有数组的信息的,所以C语⾔是⽆法通过参数将数组所有的数据⼀次性传递到函数内部,如果希望在函数内部操作数组,必须传递数组指针。
并且,调⽤函数中⽆法得知传⼊数组的长度,只能由外部传⼊数组的长度。
编写⼀个排序并且遍历数组的函数然后调⽤,⽰例代码如下:
#include<stdio.h>
void order(int *arr,int len){
//排序并且遍历
int i,j,x;
for(i=0;i<len;i++){
for(j=0;j<len;j++){
if(arr[i]>arr[j]){
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
for(x=0;x<len;x++){
printf("%d,",arr[x]);
}
}
void main(){
int arr[]={1,5,9,7,8,6,4,3,0,2};
order(arr,sizeof(arr)/sizeof(int));
}
思考:既然出⼊的是数组的指针,那么我肯定可以通过该指针来修改数组内部的数据。这样的话,我不让别⼈修改我传给他的数组的数据,代码该怎么写呢?
解决办法1:
#include<stdio.h>
const int arr[] = {1,2,3,6,4,7};
void modify(int *arr,int len) {
for (int x = 0; x<len; x++) {
arr[x] = 1;
printf("%d,", arr[x]);
}
}
void main(){
modify(arr,(sizeof(arr)/sizeof(int)));
}
这样写,别⼈就不能改变数组的值了。
但是当我把数组的定义和初始化放在main函数中的时候,
void main(){
const int arr[] = {1,2,3,6,4,7};
modify(arr,(sizeof(arr)/sizeof(int)));
}
⼜能修改了这是为什么呢?初步认为这是const关键字作⽤在局部变量时是⽆效的?内部的原因暂时不清楚。
⽤的visual studio2017。最后发现是编译器的问题。尴尬,⽤dev c++的时候连编译都通过不了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。