Bliner'Site Bliner'Site

高树靡阴,独木不林。


  • 首页

  • 分类 10

  • 标签 36

  • 归档 214

  • 关于我

  • 搜索

标签:C语言笔记

C语言中的指针-指针数组-学习笔记-39

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

什么是指针数组?

一个数组,若其元素均为指针类型数据,称为指针数组。
也就是说,每一个数组元素,都存放的是一个地址,每个元素也相当于一个指针变量。

定义一个指针数组

int * p[4]

因为 [ ] 的优先级比*高,所以,p 先跟[ ] 结合为一个数组,然后数组再跟* 结合,表示这个数组是一个指针类型的。即这个数组的每个元素都相当于一个指针,可以指向一个整型变量。

凡事没有加括号,在前面加*号的,一般都表示这是一个指针型的 XXX。例如:

int *p;  // 表示一个指针
int *p (int , int);  // 表示一个指针函数  
int *p [5];  //表示的是一个元素为指针的数组

不要写成

int (*p)[5];  //这是指向一维数组的指针变量
阅读全文 »

C语言中的指针-返回指针值的函数-学习笔记-38

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

引入

我们知道,大多数函数都有返回值,可以是整型、字符型等等,其实指针型也可以作为函数的返回值来使用,当然,返回的就是指针,也就是地址。

定义

我们如何定义一个函数呢?

int a ( int x, int y);

上面,我们定义了一个返回值为整型的函数 a,包含两个参数,x 和 y。如果改成

int *a(int x, int y);

a 的左右有 和 ( ) ,根据符号优先级,a 先与括号组成一个函数 a,在与号组成一个指针型函数,即这个函数是一个指针函数,返回的值是一个指着你地址,前面的 int ,表示这个函数返回的地址是一个 int 型地址。所以,要定一个一个返回指针值的函数的一般形式是:

类型名 * 函数名 ( 参数列表 )

上面说的可能比较晕,我们通过一个例子来说明。

使用

有3个学生,4门课,要求输入学生号之后,返回学生所有成绩,用指针的方式解决。

#include <stdio.h>
int main(){
    int student[3][4]={{66,77,88,99},{55,67,57,89},{66,78,45,99}};
    int stu_num;
    int *p;
    int * search(int num, int (*p)[4]);
    printf("请输入要查询的考生编号:\n");
    scanf("%d",&stu_num);
    p=search(stu_num,student);
    printf("%d 号考生的成绩是:\n",stu_num);
    for (int i=0;i<4;i++){
        printf("第%d 门:%d\n",i+1,p[i]);
    }
}
int *search(int num,int (*p)[4]){
    return *(p+num-1);
}
阅读全文 »

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来向后移动指针,输出我们需要的内容,这种顺序输出比较简单。

阅读全文 »
上一页 1 ... 3 4 5 ... 7 下一页
Bliner

Bliner

214 日志 10 分类 36 标签
RSS

推荐阅读

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