指针、函数和数组

C语言的学习,比较难的是指针的用法,指针搞不明白,那说明没有学好C语言。

下面将举例说明指针的一些用法,包括指针数组、数组指针、指针函数、函数指针和函数指针数组。

1. 指针

通常说所的指针是指针变量的简称,指针变量存放的是内存单元的地址,在32位处理器中地址是32位的,所以所有类型的指针都占32位即4字节。

一级指针存放非指针变量的地址,二级指针存放一级指针变量的地址。

下面来看一段程序:

#include <stdio.h>
int main(void)
{
        int a[5] = {1, 2 ,3, 4, 5}; 
        int  i;  
        for(i = 0; i < 5; i++)
                printf("a[%d] = %d %d %d %d\n", i, a[i], *(a+i), *(i+a), i[a]);
        return 0;
}

数组名a代表&a[0],是一个地址常量,对数组的操作本质是对指针的操作。i[a]这种写法也是可以的,i[a]等价于*(i+a),即*(a+i)。

2.指针数组

我们来看一个程序

#include <stdio.h>

int main(void)
{
        int a[5] = {1, 2, 3, 4, 5}; 
        int *p[5], i;
        for(i = 0; i < 5; i++)
                p[i] = &a[i];
        for(i = 0; i < 5; i++)
                printf("*p[%d]=%d\n", i, *p[i]);
        return 0;
}

数组a和数组p的区别在于数组a的每个元素都是整型变量,而数组p的每个元素都是整型指针变量。

给元素赋值:

    for(i = 0; i < 5; i++)
                p[i] = &a[i];

数组p的每个元素存放数组a的元素的地址。

编译运行程序的结果是:

    *p[0]=1
    *p[1]=2
    *p[2]=3
    *p[3]=4
    *p[4]=5

3. 数组指针

先看一个程序

 #include <stdio.h>

int main(void)
{
        int a[5] = {1, 2, 3, 4, 5}; 
        int (*p)[5], i;
        p = &a; 
        for(i = 0; i < 5; i++)
                printf("a[%d]=%d \n", i, *(*p+i));
        return 0;
}

这里p是数组指针,p指向的对象是具有10个元素的一维数组。注意p指向的对象一维数组,因此存放的必须是一维数组整体的地址,程序中的“p = &a”不能改为“p = a”,数组名代表首元素的地址,即a等价于&a[0]。

程序运行结果:

    a[0]=1 
    a[1]=2 
    a[2]=3 
    a[3]=4 
    a[4]=5

现在我们来看看另外一个程序。

#include <stdio.h>
int main(void)
{
        int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
        int (*p)[3], i, j;
        p = a;
        for(i = 0; i < 2; i++)
                for(j = 0; j < 3; j++)
                        printf("a[i][j]=%d %d %d %d %d %d\n", a[i][j],
         *(a[i]+j), *(*(a+i)+j),  p[i][j], *(p[i] +j), *(*(p+i)+j));
        return 0;
}

指针p指向的是一维数组,因此要把一维数组的地址赋给p,赋值语句“p=a”把二维数组a的首元素地址&a[0]赋值给p,a[0]是一维数组,这是正确的。可以把p等价于a使用,最后用6种方式输出二维数组a的所有元素,结果如下:

    a[i][j]=1 1 1 1 1 1
    a[i][j]=2 2 2 2 2 2
    a[i][j]=3 3 3 3 3 3
    a[i][j]=4 4 4 4 4 4
    a[i][j]=5 5 5 5 5 5
    a[i][j]=6 6 6 6 6 6

4. 指针函数

指针函数是指返回值是地址的函数,例如:

  int * fun(int a. int b);

函数fun的返回值是整型指针。

5. 函数指针

函数指针是指向函数的指针,下面看一个程序。

#include <stdio.h>
int fun(int x, int y)
{
        return x + y;
}
int main(void)
{
        int a = 5, b = 4, c;
        int (*p)(int x, int y); //函数指针
        p = fun;
        c = p(a, b); 
        printf("%d + %d = %d\n", a, b, c); 
        return 0;
}

定义语句“int (*p)(int x, int y)”定义了p是指向具有两个整型参数,并且返回值是整型的函数的指针。然后把具有两个整型参数,并且返回值是整型的函数fun赋给p,这样p就指向函数fun的入口地址,使用时传入相应的参数。

这个程序的运行结果如下:

    5 + 4 = 9

6. 函数指针数组

函数指针数组是多个相同类型函数指针的集合,下面看一个程序。

#include <stdio.h>
int fun1(int x, int y)
{
        return x + y;
}
int fun2(int x, int y)
{
        return x - y;
}
int main(void)
{
        int a = 5, b = 4, c, d;
        int (*p[2])(int x, int y); 
        p[0] = fun1;
        p[1] = fun2;
        c = p[0](a, b); 
        d = p[1](a, b); 
        printf("%d + %d = %d\n", a, b, c); 
        printf("%d - %d = %d\n", a, b, d); 
        return 0;
}

定义语句“ int (*p[2])(int x, int y);”定义了一个函数指针数组,数据p有两个元素,p[0]是一个指向具有两个整型参数,并且返回值是整型的函数的指针。然后把具有两个整型参数,并且返回值是整型的函数fun1赋给p[0],这样p[0]就指向函数fun1的入口地址,使用时传入相应的参数。

指针、函数和数组

时间: 2024-10-23 13:53:56

指针、函数和数组的相关文章

C语言中的函数、数组与指针

1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念:  函数是C语言代码的基本组成部分,它是一个小的模块,整个程序由很多个功能独立的模块(函数)组成.这就是程序设计的基本分化方法: (1) 写一个函数的关键: 函数定义:函数的定义是这个函数的实现,函数定义中包含了函数体,函数体中的代码段决定了这个函数的功能: 函数声明:函数声明也称函数原型声明,函数的原型

数组指针、指针数组、函数指针、指针函数 -----笔记

1.数组的四种访问方式 定义数组 a[]; 指针 *p 指向数组a; (1) 利用数组的下表进行访问 a[i]; (2) 数组名+地址的偏移量i *(a+i) (3) 利用指针 p 进行下表访问 p[i] (4) 指针p + 地址的偏移量i *(p+i) 一维数组数组名:相当于一个单指针 2. 数组指针(指针)     指针数组(数组) 函数指针(指针)     指针函数(函数)    -------->只看后边两个字就能够区分是指针还是数组或函数 _______________________

【C/C++学院】0726-cppIDE/一级指针/指针数组/函数指针/函数指针数组/二级指针

[送给在路上的程序员] 对于一个开发者而言,能够胜任系统中任意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并可以运用到系统中,由此简化系统的开发,是其架构生涯的第一步. 对于一个开发团队而言,能在短期内开发出用户满意的软件系统是起核心竞争力的体现. 每一个程序员都不能固步自封,要多接触新的行业,新的技术领域,突破自我. cppIDE 使用mfc和codeblocks中的mingw编译器.执行system命令中的bat批处理脚本. 一级指针 指针,结构体struct,

深入理解 [指针函数] 、[函数指针]、[指针的指针]、[指向指针数组的指针]

指针函数 1.指针函数是指带指针的函数,即本质是一个函数.当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中. 函数返回类型是某一类型的指针: 格式: 类型标识符  *函数名(参数表) int *match(void *key_x,void *key_y); 解析:首先来说它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针

8.4 数组指针 函数指针

数组指针的含义: 一个指针指向一个数组 ,这个指针+1就会加一个数组的长度. #include <stdio.h> void show( char(*s)[10], int n) { while(n--) printf("%s\n",s++); } int main() { char s[3][10] = {"hello","liuwei","xuanyuan"}; show(s,3); return 0; } 指

入职培训笔记记录--day9(1、指针函数与函数指针、函数指针数组 2、malloc memset 3、递归函数 4、结构体 5、共用体---》大小端 6、枚举)

1.指针函数与函数指针.函数指针数组 指针函数:返回值为指针的函数 char *fun() { char str[] = "hello world"; return str; } int main() { char *p = fun(); puts(p); return 0; } 编译时,会出现警告,返回了一个已经被释放掉的内存空间的首地址解决方法:1.static 2.char *str = "hello world"; 3.malloc 注意:使用完后要free

指针数组,数组指针、指针函数,函数指针

听到这几个名词不知道大家什么感受,反正我是一脸懵逼,不过我还是比较好学的,在老师的指导下,自己下去也钻研了一下,有一些自己的见解,我想在学习过程中也有童鞋遇到了相同的问题,希望我的总结能给你带来帮助. 首先我们想明确一下这几个概念,知道他们都表示什么,ok,请看: 函数指针:函数指针是指向函数的指针变量. 因而"函数指针"本身首先应是指针变量,只不过该指针变量指向函数.这正如用指针变量可指向整型变量.字符型.数组一样,这里是指向函数.如前所述,C在编译时,每一个函数都有一个入口地址,该

指针数组,数组指针,指针函数,函数指针

1.指针数组:顾名思义,指针数组就是数组里面元素都是指针,代码如下: #include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... //printf("Hello, World!\n"); int a=1,b=2;//先定义两个变量 int *p[]={&a,&b};//然后定义数组,数组元素都是指针 printf("%p\n",p[

函数指针和指针函数和回调函数以及函数指针数组

1.首先来说,函数指针 就是函数的指针 2.指针函数,就是指针的函数.也就是返回值是个指针 一.指针 [1]指针  1--- 指针变量:用于存放地址量的变量  2--- 地址常量   int a = 20:   int *p = &a: [2]运算符  1--- &  2--- *(指针解引用):通过地址获取其内容  3--- []:只针对于指针运算.指针加单位长度,后取*运算. 二.函数 [1]指针函数 [2]函数指针 [3]函数指针数组  本质:数组,由多个元素组成  元素:函数指针类

指针数组vs数组指针 指针函数vs函数指针

在分辨这些重要的概念时,我们先回顾一下前面所讲的C之三值合一,由于三个值所求出的地址是相同的,所以经常有传言说他们都是首元素的地址.这种说法是不正确的.为什么说它是不正确的呢? 首先定义一个指针,将三个值赋给它 *p=ar; *p=&ar[0]; *p=&ar//出错 程序编译后在表达式*p=&ar时出错,说明ar并不是指针类型.ar是数组名代表的是整个空间,因此ar应该是数组指针. 这四个概念看起来很容易混淆,但实际上只需要记住再看这些概念的时候先看后两个字,就可以看出它的类型,