Bliner'Site Bliner'Site

高树靡阴,独木不林。


  • 首页

  • 分类 10

  • 标签 36

  • 归档 214

  • 关于我

  • 搜索

标签:C

C语言中建立数据类型-建立结构体类型-学习笔记-44

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

引入

前面我们所见到的程序中,变量都是独立存在的,我们定义 a、b、c,那他们就只是单独存在的变量而已,在内存中的地址也是互不相干的~但是~~
实际生活中,有些数据是有内在联系的,成组出现的。
例如,一个学生,可能包含:

学号、姓名、性别、年龄、成绩、家庭地址等

这些信息往往是成组的出现。
所以,我们希望把这些数据合并在一起,成为一个组合数据,例如组成数据 student_1 的变量,这个变量中就包含了学号为1的学生的上述信息,这样我们写入和调用时就方便多了!

为什么数组不行

一个变量名,包含多重信息,咦,这不是跟数组很像吗?为什么不用数组来解决这个问题呢?因为:

数组的每个元素的数据类型是相同的,我们需要的显然是不同类型的数据,例如 姓名 和 学号。

所以,为了解决这个问题,C 语言就允许用户自己建立由不同类型数据组成的组合型数据结构,它称为结构体。
在其它的高级语言中,称为记录。

举个例子

我们根据上面学生的例子,亲手建立一个结构体。

struct Student
{ 
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};  //注意,这里有一个分号
阅读全文 »

C语言中的指针-指针部分总结-学习笔记-43

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

总结

指针的概念比较多,抽象并且复杂,我们再把这一部分的内容回顾一下。

指针的含义

记住一句话,指针就是地址。
凡事指针出现的地方,都是用地址代替的。
变量的指针:变量的地址
指针变量:地址变量

常见变量

int a;  //定义整型变量 a
int *p;  //定义指针变量 p
int a[5];  //定义数组长度为5的整型数组 a
int *p[4];  //定义指针数组,数组存储的是4个地址,地址指向整型数据
int (*p)[4];  //定义了一个指向一维数组的指针,这个一维数组包含4个元素。
int f();  //定义了一个整型函数 f,没有参数。
int *p();  //定义了一个返回值为指针的函数 p,指针指向整型。
int (*p)();  //定义了一个指向函数的指针 p,该函数返回值为整型
int **p;  //定义了一个指向指针的指针,指针指向的是整型。
void *p;  //定义了一个不指向任何对象的指针变量 p。
阅读全文 »

C语言中的指针-建立动态内存分配和 void 指针-学习笔记-42

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

什么是内存的动态分配

还记得我们之前讲过的全局变量和局部变量吗?全局变量是分配在内存中的静态存储区的,非静态的局部变量(包括形参)都是分配在内存的动态存储区的。我们称上面的存储区为 栈 (stack) 。
除此之外,C 语言还允许建立内存动态分配区域,存放一些临时用的数据,这些数据:

  1. 不必在程序的声明部分定义;
  2. 不必等到函数结束时才释放;
  3. 需要时开辟,不需要时随时释放;

这些数据是临时存放在一个特别的自由存储区,称之为堆 ( haap)。

我们可以根据需要,随时向系统申请所需大小的空间,但是我们没有声明他们是变量还是数组,也没有名字,所以我们只能通过指针来引用这些数据。

建立内存的动态分配

清楚了什么是动态分配之后呢,我们来看看如何建立这么一个叫做堆的区域。
我们对内存的动态分配,主要是通过系统功能提供的库函数来实现的,主要有malloc , calloc , free , realloc 这4个。

malloc 函数

函数原型:

void * malloc( unsigned int size);

阅读全文 »

C语言中的指针-指针数组作 main 函数形参-学习笔记-41

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

引入

前面我们学习过指针数组,即数组的元素都是由指针地址组成的数组,指针数组可以很好的存储长度不同的数组地址,从而进行调用。但是指针数组最重要的作用是作为 main 函数的形参来使用的,今天我们就来看看。

main 函数中的参数

我们知道 main 函数的一般形式是

int main(){
....
return 0;
}
// 或者
int main(void){
...
return 0;
}

也就是说,main 函数的默认形参实际上是不存在的,也就是说,调用 main 函数的时候不用给出实参传递给 main 函数的形参。
在有些情况下,实际上 main 函数可以有参数的。

int main(int argc, char * argv[])
阅读全文 »

C语言中的指针-指向指针数据的指针-学习笔记-40

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

引入

好吧,看到这个标题我是崩溃的,指针要指向数据,现在还有一个指针指向了指向数据的指针….
我们把这种指向指针数据的指针变量,称为指向指针的指针。

绕一绕

char *name[]={"Book_a","Book_b","Book_c","Book_d"};

这是一个指针数组,数组元素存放的是后面字符串的首元素地址

char *name[]={"Book_a","Book_b","Book_c","Book_d"};
//定义了一个指针数组
char *p;
p=name+i;
// name+i 表示的是一个指针,这个指针指向 name[i] 这个元素包含的指针,这就是指向指针的指针了。

name+i 是一个指针,指向的是 name[i]
name[i] 这个数组元素存放的是一个指针,所以:
name+i 是指向指针的指针。

阅读全文 »

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,该函数返回值为整型,有两个整型参数
阅读全文 »
上一页 1 ... 9 10 11 ... 14 下一页
Bliner

Bliner

214 日志 10 分类 36 标签
RSS

推荐阅读

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