视频参看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. 树莓派3B安装ubuntu mate系统后无法联网

    问题描述:在安装系统的初始化操作时,可以联网,如下图所示: 但是在系统安装结束后,wifi标志处无信号,无法搜索wifi信号. 解决方法:实测有效 直接打开终端(ctrl+alt+t),执行指令:su ...

  2. Spring boot Sample 008之spring-boot-logback

    一.环境 1.1.Idea 2020.1 1.2.JDK 1.8 二.目的 spring boot 整合log4j2 二.步骤 2.1.点击File -> New Project -> S ...

  3. Alpha冲刺 —— 5.7

    这个作业属于哪个课程 软件工程 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 Alpha冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.展 ...

  4. Take advantage of Checkra1n to Jailbreak iDevice for App analysis

    An unpatchable bootrom exploit called "checkm8" works on all iDevices up until the iPhone ...

  5. Redis 入门到分布式 (四) 瑞士军刀Redis其他功能

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 目录: 慢查询 Pipeline 发布订阅 Bitmap(位图) HyperLogLog GEO 一.慢 ...

  6. Vue父子组件传值以及父调子方法、子调父方法

    稍微总结了一下Vue中父子间传值以及相互调方法的问题,非常基础.希望可以帮到你!先来个最常用的,直接上代码: 1.父传值给子组件 父组件: <template> <div> & ...

  7. Java实现 LeetCode 430 扁平化多级双向链表

    430. 扁平化多级双向链表 您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表.这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例 ...

  8. Java实现 蓝桥杯VIP 算法训练 平方计算

    问题描述 输入正整数a, m,输出a2%m,其中表示乘方,即a^2表示a的平方,%表示取余. 输入格式 输入包含两个整数a, m,a不超过10000. 输出格式 输出一个整数,即a^2%m的值. 样例 ...

  9. Java实现8枚硬币问题(减治法)

    1 问题描述 在8枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重.可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测这枚假币. 2.1 减 ...

  10. EasyARM-iMX257 linux两年前的笔记

    我依然清晰的记得刚拿到Imx283 257的情景,兴奋中充满忧虑,对操作系统的概念只知一二,不知三四!!周立功出品的资料我一直觉得是比较精品的,同样这款iMX283配套的文档资料(v1.04)也是比较 ...