关于数组、指针、函数的整理

本文详细阐述了C语言中数组、指针和函数的概念及相互关系。从一维数组和指针的等价性,到二维数组、字符串数组、指针数组的使用,再到二级指针、指针函数、函数指针以及它们在函数调用中的应用,层层深入。此外,还探讨了函数指针数组和指向函数指针数组的指针的高级用法,揭示了C语言中这些核心概念的灵活与强大。
摘要由CSDN通过智能技术生成

目录

一、函数

二、一维数组和指针

三、二维数组和数组指针(行指针)

四、字符串数组

五、指针数组

六、二级指针

七、指针函数

八、函数指针

九、函数指针数组

十、指向函数指针数组的指针


本文旨在梳理数组、指针、函数之间的关系,部分基础概念省略。

一、函数

        完成特定任务的独立程序代码单元;

        函数的定义、调用、声明、参数、返回值;

        函数的传参:1.全局传参   2.复制传参(值传递)  3.地址传参(也有可能是指针的值传递

二、一维数组和指针

        数组名和指向数组首地址的指针的区别就是数组名是常量,不能更改,指针是变量,可以更改指向。本质上都是根据地址,操作内存。指针的操作空间为一个元素。

int s[5] = {0};
s[0] = 123;
//注意不能越界
int s1[5] = {1, 2, 3, 4, 5};
int *p = s1;
//s[i] == *(s+i) == *(p+i) == p[i]

三、二维数组和数组指针(行指针)

        数组指针的操作空间为一行元素。

int s[3][5] = {0};
s[1][1] = 11;
//列号比较重要
int s2[2][3] = {{1, 2, 3},{4, 5, 6}}
int *q = s2;
//s[i][j] == *(*(s+i)+j) == *(s[i]+j) == p[i][j] == *(*(p+i)+j) == *(p[i]+j) 

        注意数组指针的降维操作。

四、字符串数组

char s1[5] = {'h','e','l','l','o'};
char s2[32] = "world"; 
char s3[32] = {'n','i','h','a','o'};
printf("s1 = %s", s1);//输出hello+未知;
printf("s2 = %s", s2);//输出world;
printf("s3 = %s", s3);//输出nihao;一维数组的不完全初始化

五、指针数组

	int s[2][5] = {{1,2,3,4,5},{6,7,8,9,0}};
	int *p[3] = {NULL};
	p[0] = s[0]+3;
	p[1] = s[1];
	p[2] = s[0];

	printf("%d\t%d\n",*p[0], *(p[0]+1));//4 5
	printf("%d\t%d\n",*p[1], *(p[1]+1));//6 7
	printf("%d\t%d\n",*p[2], *(p[2]+1));//1 2

六、二级指针

         二级指针内保存的是一级指针的地址

        当需要操作一级指针的指向时可用,例如指针的值传递;

int a = 100;
int b = 200;
int main(){
    int *p = &a;    //此时指针p指向a
    func(&p);    
}
void func(int **q){ //将指针p的地址传给函数形参,一级指针的地址要用二级指针保存
	*q = &b;        //此时二级指针q指向一级指针p,用*q即可更改p的指向
}

七、指针函数

        函数的返回值是一个指针;

        指针函数返回的地址,在主调函数中必须是有效的;

int *func(int x, int y){
    static int temp = 0;
    temp = x + y;
    return &temp;
}
int main(){
    int *p = func(a,b);
    printf("%d\n", *p)
}

八、函数指针

        通过函数指针来调用函数,函数名代表函数的入口地址;

int func(int x, int y);

int main(){
    int a = 100;
    int b = 200;
    int (*p)(int ,int) = NULL;
    p = func;
    
    int s = p(a,b);
    return 0;
}

九、函数指针数组

        包含若干个函数指针变量的数组;

int func1(int x, int y);
int func2(int x, int y);

int main(){
    int a = 100;
    int b = 200;
    int (*arr[2])(int ,int) = NULL;
    arr[0] = func1;
    arr[1] = func2;
    
    int s = arr[0](a,b);
    int r = arr[1](a,b);
    return 0;
}

十、指向函数指针数组的指针

        字面意思:指向(函数指针数组)的 (指针)

int func1(int x, int y);
int func2(int x, int y);

int main(){
    int a = 100;
    int b = 200;
    int (*arr[2])(int ,int) = {func1, func2};//定义函数指针数组arr,内有两个函数
    int (*(*p))(int, int) = NULL;//定义一个指针指向函数指针数组;
    p = arr;
    
    int s = p[0](a,b);
    int r = p[1](a,b);
    return 0;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值