Bliner'Site Bliner'Site

高树靡阴,独木不林。


  • 首页

  • 分类 10

  • 标签 36

  • 归档 214

  • 关于我

  • 搜索

标签:C语言笔记

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;
            }
        }
    }
}
阅读全文 »

C语言中的指针-通过指针引用数组元素-学习笔记-27

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

引用数组元素

前面我们学习了,引用数组有两种方式:
下标法:a[i]
指针法:(a+1) / (p+1)
今天我们实际来通过这两种方式引用一下数组元素看看能有哪些不同。

例题-1

有一个整形数组 a,有10个元素,要求输出数组中的全部元素。

思路

现在我们会使用3中方法,下标法、数组名计算元素地址、指针变量指向数组元素。

下标法

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

我们通过遍历数组的下标,输出数组。

阅读全文 »

C语言中的指针-数组元素的指针-学习笔记-26

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

通过指针引用数组元素

前面我们说变量有指针,那么数组元素有没有指针呢?数组元素也有指针,并且我们也可以通过指针来引用数组元素。

数组元素的指针

我们说一个变量是有地址的,数组包含了很多的元素,每个元素都在内存中占用存储单元,这些数组元素也都有相对应的地址,指针可以指向变量也可以指向数组。所谓数组元素的指针,就是数组元素的地址。

使用数组指针

int a[5]={1,2,3,4,5};  //定义了包含5个元素的数组
int * p;  // 定义了一个指针变量 p
p=&a[0];  //将数组的第一个元素地址传递给指针变量

我们看到,其实和变量指针类似,只不过我们这里给指针变量的地址是数组元素的地址。平时,我们引用数组元素采用的都是下标法即通过数组名+元素下标的方式表示数组。现在,我们也可以使用指针法,即通过指向数组元素的指针来找到所需要的元素。

阅读全文 »

C语言中的指针-指针变量作为函数参数-学习笔记-25

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

指针变量作为函数参数

我们说过,函数参数可以是变量,那么既然指针变量也是变量的一种,能否作为函数的参数呢?答案是肯定的!而指针变量作为函数参数的主要作用是,将变量地址传送到函数中。

从例子引入

我们通过两个使用指针变量作为函数参数的例子,来引入我们今天的内容。

问题

输入两个数,返回其中的较大者,设计一个自定义函数进行比较,要求使用指针变量作为函数参数。

解答

#include <stdio.h>
int main(){
    int a, b;
    int abmax(int * pointer_1, int * pointer_2);
    //声明了一个指针变量作为参数的函数
    int * a_pointer, * b_pointer;
    printf("请输入两个数:\n");
    scanf("%d %d",&a,&b);
    a_pointer=&a;
    b_pointer=&b;
    //给指针变量赋值
    printf("%d 和 %d 中较大的是:%d\n",a,b,abmax(a_pointer, b_pointer));
    return 0;
}

int abmax(int *pointer_1, int *pointer_2){
    if (*pointer_1>*pointer_2){
    //接收到指针变量的地址后,对比该地址的数据内容
        return (*pointer_1);
    }else{
        return (*pointer_2);
    }
}
阅读全文 »

C语言中的指针-定义和引用指针变量-学习笔记-24

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

指针变量

前面我们说,存放地址的变量,称为指针变量,那么我们该如何定义和使用指针变量呢?

使用指针变量

我们先从一个例子引入:
问题:先定义2个整型变量,再定义2个指针变量,分别指向这两个整型变量,通过访问指针变量,找到他们所指向的变量,从而获得这些变量的信息。

#include <stdio.h>
int main(){
    int a=1,b=2;  //定义了两个整型变量
    int * a_pointer , * b_pointer;  // 声明了两个指针变量,没有定义
    a_pointer=&a;  // 将变量 a 的地址传给 a_pointer
    b_pointer=&b;  //将变量 b 的地址传给 b_pointer
    printf("a=%d,b=%d\n",a,b); 
    printf("a_pointer=%d,b_pointer=%d\n",* a_pointer,* b_pointer);
    return 0;
}

我们可以看到,输出的时候,其结果是相同的,因为 a_pointer 和 b_pointer 有了 a 和 b 的地址,前面加上*号之后,就代表了该地址所指向的数据内容。

阅读全文 »

C语言中的指针-指针和指针变量-学习笔记-23

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

指针

结束了函数的学习,我们进入了 C 语言最经典的核心内容,指针的学习,指针的概念理解比较复杂,使用起来也比较灵活,但是指针是 C 语言的灵魂,只有学会如何使用指针,才能算是学会了 C 语言。

引入指针

在引入指针之前,我们需要知道,数据在内存中是如何存储和读取的,这样才能帮助我们更好的理解指针这个概念。

数据在内存中的存储和读取

程序定义了一个变量,在程序编译时,就会给这个变量分配内存单元。至于内存单元的大小,是变量类型决定的。在 Visual C++ 中,为整型分配4个字节,单精度浮点型分配4个字节,对字符型变量分配1个字节。
内存区的每一个字节都有一个编号,这就是地址。你可以理解为存储柜的箱号,在地址所标志的内存单元中存放的数据则相当于箱子内寄存的物品。
现在,有了地址,我们就能通过地址找到所需要的变量单元,我们就说地址指向该变量单元。我们举个例子:

阅读全文 »

C语言中的函数-变量、内部函数和外部函数-学习笔记-22

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

关于变量的声明和定义

变量我们很早就讲过,现在再提主要是为了区分变量声明和定义的区别。我们知道自定义函数有两部分,分为声明部分和执行语句,声明是将函数的有关信息告诉编译器。而对与变量而言,声明有两种情况,一种是需要建立存储空间的,例如int a=10;,我们在声明变量 a 的同时,对 a 附加了初始值,建立了对应的存储空间,我们称这种为变量的定义性声明。另一种是不需要建立存储空间的int a;,我们称这种为变量的引用性声明。

#include <stdio.h>
int main(){
int a=1;  //我们称之为定义性声明
int b;  //我们称这种没有赋值或者说没有建立存储空间的为引用性声明
}

我们也可以这么理解,声明可以包括定义,定义不一定包括声明,我们可以在声明的时候同时定义,但不能说定义就是声明,因为变量需要先声明后定义。

外部变量只能定义一次,外部变量的声明有多次。因为声明是扩大外部变量的作用域范围,而定义则是必须在初始化的时候进行,因为编译器只根据定义分配存储空间,声明只是表达变量的作用域范围。

阅读全文 »

C语言中的函数-变量的存储方式和生存期-下-学习笔记-21

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

局部变量的存储类别 (下)

上面我们讲了自动(auto)变量和静态(static)变量,接下来我们将剩下的部分。

寄存器变量

一般情况下,变量(动态变量或静态变量)一般都存放在内存中,当程序需要用到哪个变量的时候,控制器发出一个指令,将内存中该变量的值发送到运算器中,经过运算器进行运算。如果需要存储数据,那就等运算结束后,再从运算器将数据送回内存。
其实还是蛮好理解的,就是从内存拿了数去运算器运算,算完了结果再返回给内存存储。但是如果遇到一些变量频繁的使用,我们就要频繁的执行取了算-算了存这样的操作,比如我们要循环100000次,这样我们每次存取的过程都会非常浪费时间。
为了解决这样的问题,程序允许我们将数据存放在 CPU 的寄存器中,需要的时候从寄存器中取数据到运算器就好了。你会发现这还是一个取了算-算了存的过程,怎么会解决我们存取时浪费时间的问题呢?

因为数据在 CPU 寄存器中读取的速度远大于在内存中的速度,就好像从老式软盘升级到了 SSD 固态硬盘。所以我们的存取过程的时间大幅度节省了。

阅读全文 »

C语言中的函数-变量的存储方式和生存期-上-学习笔记-20

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

变量的存储方式

前面我们说过,变量根据位置的不同,分为不同的作用域。今天我们通过变量存在的时间来观察变量的存储方式。

动态存储方式和静态存储方式

有的变量是在程序运行过程中一直存在,有的则是在调用其所在的函数时才临时分配存储单元,而在函数调用结束后,该存储单元就马上释放了,变量不存在了。综上,我们发现变量根据存在时间的不同,分为动态存储方式和静态存储方式两种。
**静态存储方式:**是指程序在运行期间,由系统分配固定的存储空间。
**动态存储方式:**是指程序运行期间根据需要进行动态的分配存储空间的方式。

不同存储区域下数据的存储和释放

在内存中,可以供用户使用的存储空间分为一下三种:

  1. 程序区
  2. 静态存储区
  3. 动态存储区
阅读全文 »
上一页 1 ... 4 5 6 7 下一页
Bliner

Bliner

214 日志 10 分类 36 标签
RSS

推荐阅读

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