Bliner'Site Bliner'Site

高树靡阴,独木不林。


  • 首页

  • 分类 10

  • 标签 36

  • 归档 214

  • 关于我

  • 搜索

分类:笔记&教程

C语言中的指针-用指向函数的指针作为函数参数-学习笔记-37

发表于 2018-10-12 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 44

引入

其实,作为指向函数的指针变量,它最重要的作用就是把函数的地址,作为参数传递给其他的函数。

例子

输入三个数,将其中最大值和最小值的和输出出来。

#include <stdio.h>
int main(){
    int max(int a, int b);
    int min(int i, int j);
    int count (int (*num_max)(int,int),int (*num_min)(int,int),int count_num[]);
    int num[3];
    printf("请输入三个数:\n");
    scanf("%d %d %d",&num[0],&num[1],&num[2]);
    printf("最大值和最小值相加的和为:%d",count (max,min,num));
    return 0;
}

int max(int a, int b){
    return a>b?a:b;
}

int min(int i , int j){
    return i<j?i:j;
}

int count(int (*num_max)(int,int),int (*num_min)(int,int),int count_num[]){
    int max,min;
    max=(*num_max)(count_num[0],(*num_max)(count_num[1],count_num[2]));
    min=(*num_min)(count_num[0],(*num_min)(count_num[1],count_num[2]));
    return max+min;
}
阅读全文 »

C语言中的指针-定义和使用指向函数的指针变量-学习笔记-36

发表于 2018-10-11 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 86

引子

上一节,我们通过例子知道,何如定义一个函数指针,并且把这个指针指向函数,现在我们进一步看看该如何定义和使用指向函数的指针变量。

定义

定义指向函数的指针变量一般形式为:

类型名 (* 指针变量名)(函数参数表列)

int (*p)(int,int);

注意,指针变量名必须用括号包起来。类型名,是指函数返回值的类型。

阅读全文 »

C语言中的指针-函数指针和函数指针变量调用函数-学习笔记-35

发表于 2018-10-11 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 32

引入

前面,我们学习了,将指针指向变量、指向数组、指向字符数组,今天我们要引入一个新的概念,指针指向函数。

什么是函数指针?

如果程序中定义了一个函数,那么在编译时,编译系统会为函数代码分配一段存储空间,我们称这段存储空间的起始地址,称为这个函数的指针。

所以,我们在捋顺一下:

指针指向变量:变量的地址
指针指向数组:数组首元素的地址
指针指向多维数组:数组首行元素的地址
指针指向字符数组:字符数组的首元素地址
指针指向函数:函数存储空间的起始地址

如何定义一个函数指针

函数指针,意味着这个指针指向该函数:

int (*p)(int,int);
// 我们定义了一个指向函数的指针 p,该函数返回值为整型,有两个整型参数
阅读全文 »

C语言中的指针-字符串指针变量和字符数组的比较-学习笔记-34

发表于 2018-10-10 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 64

引入

上面我们引入了很多例子,发现字符指针和字符数组仿佛使用起来差不多,真的是这样嘛?其实并不是,我们来细数字符指针和字符数组之间的区别吧!

组成

字符指针和字符数组的组成上,有很大的不同。
字符指针:存放的是地址,是字符串首元素的地址。
字符数组:存储的是数组中的所有元素。

赋值方式

字符指针:我们可以对指针赋值,赋值一个新的地址给指针。
字符数组:我们不能给一个数组名赋值,职能给某一个数组元素赋值。

//对字符指针变量赋值;
char *a="Hello!";
a="Hello";  //注意,这里不是*a,因为要把这个字符串的首地址给 a,a 是指针,只能接收地址。

//对字符数组赋值
char str[20]="Hello!";
str[2]="C";

//下面的方式就是错误的
str="I am Chinese!"
我们无法对数组名直接赋值。
阅读全文 »

C语言中的指针-通过指针引用字符串-学习笔记-33

发表于 2018-10-10 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 108

引入

前面,我们知道数组和指向数组的指针都可以作为函数参数,那么字符指针能否作为函数参数呢?答案是肯定的。
在 C 语言中,如果我们需要传递字符串,其实传递的是该字符串首元素的地址,这样我们顺着地址移动指针就可以找到这个字符串了。
因为我们传递的是地址,所以改变了该地址后面的元素内容后,主调函数也会同时改变。

函数调用的方式实现字符串复制

用函数调用的方式,实现字符串的复制。

#include <stdio.h>
int main(){
    void copystr(char a[],char b[]);
    char str_a[]="I am Chinese!",str_b[20];
    copystr(str_a,str_b);
    printf("%s\n",str_b);
    return 0;
}
void copystr (char a[],char b[]){
   int i;
    for(i=0;a[i]!='\0';i++){
        b[i]=a[i];
    }
    b[i]='\0';
}
阅读全文 »

C语言中的指针-通过指针引用字符串-学习笔记-32

发表于 2018-10-09 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 68

引入

我们经常使用字符串,printf 中 " " 双引号之间 的内容可以直接输出,如今我们学习了指针的概念,通过指针来引用字符串,可以更加灵活和方便。

如何引用字符串?

我们知道,在 C 语言中,字符串是存放在数组中的,想要引用一个字符串,可以有一下两种方法:

用字符数组存放一个字符串

#include <stdio.h>
int main(){
    char str[]="Hello"; //这里的 str 数组大小可以省略
    printf("%s\n",str);
    for(int i=0;i<10;i++){
        printf("%c",str[i]);
    }
    printf("\n");
    return 0;
}

我们可以在printf 中用 %s 输出,也可以通过数组名和下标方式引用该字符串。

阅读全文 »

C语言中的指针-指向多维数组元素的指针变量-学习笔记-31

发表于 2018-10-09 | 分类 笔记&教程 | 评论数: 1 | 阅读次数: 57

引入

我们现在搞清楚了数组的地址以及如何使用指针来调用数组和数组元素,现在我们用指向数组的指针作为函数的参数,看看有什么新玩法!

用指向数组的指针作为函数参数

一维数组和多维数组的数组名可以作为函数参数。我们如果使用指针变量作为形参,那么接收到的是从实参发送过来的地址。
传送地址有两种方法:

  1. 用指向变量的指针变量,这就是变量的地址。
  2. 用指向一维数组的指针变量,这就是该数组的首地址。

举个例子

问题:

有一个班,3名学生,各学4门,计算总平均分,以及第n个学生的成绩。

思路:

3个学生,各学4们,这就是一个 3X4 的多维数组。
计算第 n 个学生的成绩,这就是知道行元素,求列元素的总和。

解题:

#include <stdio.h>
int main(){
    int ave(int *pointer_list);
    int search(int (*p)[4],int n);
    int list[3][4]={{88,44,66,100},{66,88,97,78},{88,99,98,78}};
    int i;
    printf("总平均分是:%d\n",ave(*list));
    printf("请输入要查询的考生编号:\n");
    scanf("%d",&i);
    printf("%d号考生的总成绩是:%d",i,search(list,i));
    return 0;
}

int ave(int *pointer_list){
    int count=0;
    int *num_end;
    num_end=pointer_list+12;
    for(;pointer_list<num_end;*pointer_list++){
        count=count + *pointer_list;
    }
    return count/12;
}
int search(int (*p)[4],int n){
    int count=0;
    for(int i=0;i<4;i++){
        count=count+*(*(p+n)+i);
        printf("%d ",*(*(p+n)+i));
        if (i==3) {
            printf("\n");
        }
    }
    return count;
}
阅读全文 »

C语言中的指针-指向多维数组元素的指针变量-学习笔记-30

发表于 2018-10-08 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 32

引入

前面,我们介绍了多维数组地址的概念,现在我们就学习如何用指针指向多维数组的元素。

例子

我们看一个例子:
有一个 3X4 的二维数组,要求用指向元素的指针变量输出二维数组各个元素的值。

#include <stdio.h>
int main (){
    int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
    int *pointer_a=a[0];
    int i=0;
    while(i<12){
        printf("%d\n",*(pointer_a+i));
        i++;
    }
}

上面,我们让指针变量 pointer_a 指向了 a[0]的地址,然后通过不断的+1来向后移动指针,输出我们需要的内容,这种顺序输出比较简单。

阅读全文 »

C语言中的指针-指针引用多维数组-学习笔记-29

发表于 2018-10-08 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 34

引入

前面我们知道,指针可以指向一维数组中的元素,同样的,指针也可以指向多维数组。这个概念比较绕,要清楚不同层的地址,以及不同的*号所指向的值,以及灵活运用数组名即首元素地址这一概念。

还记得多维数组吗?

之前我们引入过多为数组的概念,很像行列式,例如:

int a[2][3]={{1,2,3},{4,5,6}}
//这就是一个简单的二维数组,2行3列

上面的 a 是数组名
a 数组包含2个行元素:a[0] 和 a[1]。
上面的每一个行元素又都是一个一维数组
每一个行元素又包含3个列元素:a[0][0] 、a[0][1] 和 a[0][2]

我们可以理解为,二维数组是数组的数组,上面这个二维数组是由 2 个一维数组组成的,a[0] 和 a[1] 就是这两个一维数组的数组名。

阅读全文 »

C语言中的指针-数组名作为函数参数指针-学习笔记-28

发表于 2018-09-25 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 41

数组名和指针

我们先来捋一遍数组名和指针。数组名是该数组的首元素起始地址,说白了,也是一个地址,但这个地址是不变的,是固定的是一个常量,数组名后面附加角标,叫可以表示该数组中的某一个元素的值。指针是指向某一变量或数组的地址,和数组名一样,都是地址,但指针的内容是可以改变的,指针前加*号就可以表示这个地址所指向的数据的值。

所以,我们现在知道了,数组和指针都表示的是一个地址。

数组名作为函数参数

我们照旧从一个例子出发,来理解这个概念,我们输入5个数到一个数组中,并且将数组中的5个数从大到小存储在数组中,接着依次输出这5个数。

#include <stdio.h>
int main(){
    void arr(int num[]);
    int array[5];
    for(int i=0;i<5;i++){
        scanf("%d",&array[i]);
    }
    arr(array);
    for(int i=0;i<5;i++){
        printf("%d\t",array[i]);
    }
    return 0;
}
void arr(int num[]){
    int big;
    for(int i=0;i<5;i++){
        for(int k=0;k<4;k++){
            if(num[k]<num[k+1]){
                big=num[k+1];
                num[k+1]=num[k];
                num[k]=big;
            }
        }
    }
}
阅读全文 »
上一页 1 ... 10 11 12 ... 14 下一页
Bliner

Bliner

214 日志 10 分类 36 标签
RSS

推荐阅读

关于GTD中项目“复盘”的一想法
© 2008 - 2026 Bliner
鲁ICP备13021673号