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所保存的地址
}
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++的时候连编译都通过不了。

猜你喜欢

转载自blog.csdn.net/u013812502/article/details/81196875
今日推荐