zoukankan      html  css  js  c++  java
  • C预备知识_001

    程序由什么构成?

    1、对数据的描述;在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式,其实这就是数据结构(data structure)。

    2、对操作的描述;即要求计算机就行操作的步骤,也就是算法(algorithm)。

    数据是操作的对象,操作的目的是对数据进行加工处理,来得到期望的结果。

    作为程序设计人员,必须认真考虑和设计数据结构和设计操作步骤(即算法)。

    著名计算机科学家沃思(Nikiklous Wirth)提出了一个公式:

      算法 + 数据结构 = 程序

    知道今天,这个公式对于过程化程序来说仍然是适用的。

    ——摘自《C程序设计 第四版》谭浩强

    不要认为只有“计算”的问题才有算法。广义地讲,为了解决问题而采取的方法和步骤,就称为“算法”。例如,描述太极拳动作的图解,就是“太极拳的算法”。

    计算机算法分为两类:数值运算算法和非数值运算算法。

    算法的特性:有穷性、确定性、0个或多个输入、1个或多个输出、有效性

    结构化程序设计方法的基本思路:

      1、自顶向下

      2、逐步细化

      3、模块化设计

      4、结构化编码

    3、结构体的长度是多少很复杂

    因为它涉及到字符填充机器字对齐

    4、指针变量大小就是4字节

    1 char * p1;
    2 
    3 int * p2;
    4 
    5 float * p3;
    6 
    7 double * p4;
    8 
    9 std::cout<<sizeof(p1)<<endl<<sizeof(p2)<<endl<<sizeof(p3)<<endl<<sizeof(p4)<<endl;

    输出:

    4

    4

    4

    4

    1 char * p1;
    2 
    3 int * p2;
    4 
    5 float * p3;
    6 
    7 double * p4;
    8 
    9 std::cout<<sizeof(p1)<<endl<<sizeof(p2)<<endl<<sizeof(p3)<<endl<<sizeof(p4)<<endl;

    输出:

    1

    4

    4

    8

    注意:指针变量为啥只占4字节,因为这里的地址最大只需要4字节即可表示。而且这取决于编译器,32位的编译器指针变量占4byte,64位的编译器指针变量就占8byte。

    5、变量名跟指针的区别

    往下看之前,你要带着问题看,通过函数改变一个变量,我们是选择方法一、还是方法二、方法三,好处是啥?为啥要这样选?

    方法一:

     1 # include <iostream>
     2 
     3 using namespace std;
     4 
     5 void change(int);
     6 
     7 int main(int argc, char const *argv[])
     8 {
     9     int m = 6;
    10 
    11     change(m);
    12 
    13     cout<<m<<endl;
    14 
    15     return 0;
    16 }
    17 
    18 void change(int n)
    19 {
    20     n = 7;
    21 }

    输出:6

    这样的输出结果是不是让你大吃所惊呢?明明改变了m的值,为啥最后是没有呢?

    补充:开始我觉得大家通过后面的例子应该能明白,使用了函数change()后为啥没有改变m的值。发表完我觉得我还是再啰嗦一下。

        首先我们定义了一个变量 int m = 5; 

        当我们调用函数change()时,定义了另一个变量 int n; 然后使用 change(m); 就是把m的值赋给n,即&n指向了m的地址,然后就没有m的事了,后来你改变的是变量n,跟变量m没一毛钱关系。

    其实你所理解的应该是这样的

    方法二:

     1 # include <iostream>
     2 
     3 using namespace std;
     4 
     5 int change(int);
     6 
     7 int main(int argc, char const *argv[])
     8 {
     9     int m = 6;
    10 
    11     m = change(m);
    12 
    13     cout<<m<<endl;
    14 
    15     return 0;
    16 }
    17 
    18 int change(int n)
    19 {
    20     n = 7;
    21 
    22     return n;
    23 }

    输出:7

    但是你还可以这样:用指针传参

    方法三:

     1 # include <iostream>
     2 
     3 using namespace std;
     4 
     5 void change(int *);
     6 
     7 int main(int argc, char const *argv[])
     8 {
     9     int m = 6;
    10 
    11     change(&m);
    12 
    13     cout<<m<<endl;
    14 
    15     return 0;
    16 }
    17 
    18 void change(int * n)
    19 {
    20     * n = 7;
    21 }

    输出:7

    现在知道指针的魅力了吧,它能改变数值啊。

    看完了这三种方法,你能回答上面的问题吗?

    很明显方法一不能用,因为它达不到所要的效果。

    那么就剩下方法二跟方法三待选了?

    选择方法三,假如m不是一个简单数据类型而是一个结构体类型。使用方法三有如下优点:

    (这也是指针的优点

      ①可以快速的更改数据

      ②耗用内存小(因为指针变量只占4byte)

      ③执行速度快

  • 相关阅读:
    2015年秋季个人阅读计划
    MFC Cstring转化为string
    虚拟机无法共享文件夹解决
    YCM编译安装
    windows 下mysql loadfile 返回NULL的解决
    读“单例写出花来”瞎想
    Spark Scheduler内部原理剖析
    go 获取函数被调用的文件即行数
    spark 获取applicationID
    spark job, stage ,task介绍。
  • 原文地址:https://www.cnblogs.com/arvintang/p/5107514.html
Copyright © 2011-2022 走看看