视频参看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声明这个数组,将数组的内容打印出来

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

linux下的c语言编程学习笔记的更多相关文章

  1. Linux C语言编程学习笔记 (1)进程控制入门

    想进行Linux系统开发已经很久了,一直没有付诸实践.今日终于开始学习Linux下的C语言编程,研究一天,终于大概弄明白了Linux系统进程管理的一些基本概念和编程方法,总结下来以方便大家学习和自己实 ...

  2. Linux下的C语言编程

    一.在Linux下的C语言编程所需工具(下面所列举的都是我编程所用的工具) 1.文本编辑器 Vim 2.编译链接工具 gcc 3.调试器 gdb 4.项目管理工具 make和makefile 二.VI ...

  3. 在Linux下开始C语言的学习

    为什么要在linux下学习C语言? linux下可以体验到最纯粹的C语言编程,可以抛出其他IDE的影响 环境配置简单,一条命令就足够.甚至对于大多数linux发行版本,都已经不需要配置C语言的环境 查 ...

  4. 【C语言编程学习笔记】利用462字节代码实现雅虎logo ACSII 动画!

    ACSII 动画演示:   不过本文介绍的是另一个作品:c 代码实现雅虎 logo ACSII 动图. 运行后,你将会看到:   它是一个 20fps.抗锯齿的 Yahoo! logo ASCII 动 ...

  5. Linux下的C高级编程---学习

    一.进程        一个正在运行的程序称为进程.例如在屏幕上正打开两个终端窗口,则说明同一个终端程序正在做为两个进程而同时执行,而每个终端窗口又都在执行shell,则每个shell又是另外一个进程 ...

  6. linux下C的GBD调试学习笔记(转载)

    1. 单步执行和跟踪函数调用 看下面的程序: 例 10.1. 函数调试实例 #include <stdio.h> int add_range(int low, int high) { in ...

  7. linux下的OpenCV安装&学习笔记

    http://www.linuxdiyf.com/viewarticle.php?id=20731 (本想在fedora下安装编译的,但目前opencv官网.sourceforge等网站都无法访问下载 ...

  8. Perl语言编程>>学习笔记2

    1. Perl中变量的常用表示  ${var} 相当于 $var  $Dog::days  在Dog包里面的变量$days  $#days  @days 的最后一个索引  ]  $days 引用的数组 ...

  9. Perl语言编程>>学习笔记

    1. 使用反引号可以调用外部程序并返回程序的输出, 如  $cwd = `pwd`; 2. Perl 中的变量类型之间的区别主要是单数和复数; 单数变量称为标量 $scalar , 复数变量称为数组 ...

随机推荐

  1. 01)原生php写一个小网站

    PHP留言板说明 1.帮朋友做一个毕业设计,本科大学生,都不知道框架是什么...只能原生PHP写了. 2.这里主要是做一个学习笔记. 3.项目开始会杂乱无章,慢慢整理. 需求 (1)用户注册:用户实现 ...

  2. Linux下db2V10.5命令行安装超详细图文教程(附下载地址)

    下载地址:https://pan.baidu.com/s/1GtF03x1FMF3IsGdSiBJu-g 提取码:8vfj 失效了发邮件:wells974@163.com 一.db2prereqche ...

  3. Error C2079 'CMFCPropertySheet::m_wndOutlookBar' uses undefined class 'CMFCOutlookBar'

    Severity Code Description Project File Line Suppression StateError C2079 'CMFCPropertySheet::m_wndOu ...

  4. VUE 子组件向父组件传值 , 并且触发父组件方法(函数)

    目标:封装一个  搜索组件 <子组件需要传一个或者多个搜索参数到父组件,然后父组件执行列表查询函数> 1.子组件 <div> <input v-model="l ...

  5. Java实现 LeetCode 699 掉落的方块(线段树?)

    699. 掉落的方块 在无限长的数轴(即 x 轴)上,我们根据给定的顺序放置对应的正方形方块. 第 i 个掉落的方块(positions[i] = (left, side_length))是正方形,其 ...

  6. Java实现 蓝桥杯VIP 算法训练 输出米字形

    例如:n=3时,包含A,B,C:n=4时,包含A,B,C,D. 矩阵的正中间为n个字母中字典序最大的那个,从这个字母开始,沿着西北.正北.东北.正西.正东.西南.正南.东南八个方向各有一条由大写字母组 ...

  7. Java实现 LeetCode 66 加一

    66. 加一 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示 ...

  8. java实现 洛谷 P1014 Cantor表

    题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 - 2/1 2/2 2/3 2/4 - ...

  9. 云服务器部署Web项目

    接着上一篇整好MySQL数据库了,部署Web项目的重要一步就完成了,接下来就是整Tomcat发布项目了,这个博主用的是宝塔面板,所以,也很简单,直接在宝塔面板软件商店选择对应的Tomcat版本安装就行 ...

  10. JPA入门及深入

    一:ORM介绍 ORM(Object-Relational Mapping) 表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到建立对象与数 ...