zoukankan      html  css  js  c++  java
  • linux下的c语言编程学习笔记

    视频参看csdn学院王阳和下面的linux环境下c语言编程基础相当的经典,其中王阳的视频讲的很好,相当的经典

    编译hellogcc.c需要依赖/home目录下的头文件

    为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式。在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。

       方式一:

       #ifndef __SOMEFILE_H__

       #define __SOMEFILE_H__

       ... ... // 声明、定义语句

       #endif

       方式二:

       #pragma once

       ... ... // 声明、定义语句

       #ifndef的方式受C/C++语言标准支持。它不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件(或者代码片段)不会被不小心同时包含。

    上面定义了一个define_test.h头文件

    使用extern引用外部文件定义的变量和函数

    使用static声明的变量和函数,在外面使用extern是无法访问的。、

    整形变量存储的是整形数据,

    指针变量存储的是地址

    32位对应的指针变量是4个字节

    64位对应的指针变量时8个字节

    PValue是一个指针变量,在32位的电脑上sizeof始终是4个自己,在64位上结果是8个字节。

    *pValue的值就0X01

    pValue+1的地址0X00012B40+sizeif(char)*1 = 0X00012B41

    *( pValue+1)的值是0X02

    0X00102000这个地址不是malloc申请的,可能是系统的地址,我们向该地址的空间写值,会导致系统奔溃

    上面就是一种野指针,可能导致程序奔溃。

    上面pValue能访问四个字节,但是只要0X00012B40是申请过的,0X00012B41,0X00012B42,0X00012B43的地址空间里面可能存储很重要的数据,你把100存储在里面,就可能会导致系统奔溃。

    上面这张模式是大段存储

    用下面的代码就可以:

    Signal是一个函数,该函数有两个参数,一个是int,一个是handle的函数指针,该函数的返回值是一个地址*,例如地址是aa。就变成int(*aa)(int y)

    指针比较比较的是地址编号的大小,不是比较里面的值

    就像是邮箱,邮箱有编号,每个编号的邮箱里面存储的值不一样

    上面这种指针指向的内容是只读的,是不能发送变化的

    是错误的,不能给指针赋值,指针是常量

    先执行p1++,在执行指针指向空间的值。

    输出的结果是300

    数组的指针就是数组名称或者数组第一个元素的地址,数组名称是常量是不能加减运算的

     

    上面是有问题的,因为p2指针已经移动了字符串的最后,应该将p2该成b

    第一种情况:数组的内容是hello,数组的长度是6,字符串最后带有’/0’

    第二种情况:数组的内容是hello,最后那个‘/0’不能存储,数组的长度是5

    第三种情况:数组的内容是hell0,数组的长度是10

    上面这个分析是错误的,运行代码的时候报错

    运行的时候报错,所以这个地方数组名不能代表第一个元素的地址

    上面输出的结果是4和25,如果array代表第一个元素的地址,那么array是一个地址,输出的结果应该是4而不是25,但是这里输出25,说明array在这个地方的代表的是整个数组的地址

    说明这种情况下,数组名代表的是整个数组

    总结:

    上面数组名在sizeof和&之后,说明数组名代表的是整个数组

     

    第一个情况是求整个数组的存储空间

    第二个是对整个数组取地址,要保证整个数组的空间

    这种情况array代表的就是第一个元素的地址

    上面是正确的相当的经典

    例子2

    Ptr代表二位数组中第一个元素的地址,该元素是一个数组,有三个元素

    Ptr+1代表该数组中的第二个元素的地址

    列子3

    上面中*ptr就是第一个元素的地址就是数组名array,访问第一个元素的值就是**ptr

    第二个元素的地址就是*ptr+1,得到第二个元素的值就是*(*ptr+1)

    上面*ptr=array[0],*(ptr+1)等于array[1]

    左值存储left的变量地址0x000012B4在编译期间就分配了存储空间的地址

    右值在运行的时候在知道

    程序在编译的时候就产生了上面的符号表,记录了array和temp对应的内存地址

    所以数组是直接访问,指针因为放存了2次,所以叫做间接访问

    如果把数组当成指针去访问会出现下面的错误:

    A的ascll的值就是61 b对应的是62

    Extern的例子

    在a.c中定义了一个数组,在b.c中使用extern声明这个数组,将数组的内容打印出来

    但是下面的情况就会出现错误,把一个数组当成指针来访问

  • 相关阅读:
    BZOJ 3218: a + b Problem
    P4542 [ZJOI2011]营救皮卡丘
    P4843 清理雪道
    P4553 80人环游世界
    P4126 [AHOI2009]最小割
    P2619 [国家集训队2]Tree I
    P2469 [SDOI2010]星际竞速
    P2050 [NOI2012]美食节
    易语言入门
    jdbc连接oracle语法
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/6953171.html
Copyright © 2011-2022 走看看