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声明这个数组,将数组的内容打印出来
但是下面的情况就会出现错误,把一个数组当成指针来访问
linux下的c语言编程学习笔记的更多相关文章
- Linux C语言编程学习笔记 (1)进程控制入门
想进行Linux系统开发已经很久了,一直没有付诸实践.今日终于开始学习Linux下的C语言编程,研究一天,终于大概弄明白了Linux系统进程管理的一些基本概念和编程方法,总结下来以方便大家学习和自己实 ...
- Linux下的C语言编程
一.在Linux下的C语言编程所需工具(下面所列举的都是我编程所用的工具) 1.文本编辑器 Vim 2.编译链接工具 gcc 3.调试器 gdb 4.项目管理工具 make和makefile 二.VI ...
- 在Linux下开始C语言的学习
为什么要在linux下学习C语言? linux下可以体验到最纯粹的C语言编程,可以抛出其他IDE的影响 环境配置简单,一条命令就足够.甚至对于大多数linux发行版本,都已经不需要配置C语言的环境 查 ...
- 【C语言编程学习笔记】利用462字节代码实现雅虎logo ACSII 动画!
ACSII 动画演示: 不过本文介绍的是另一个作品:c 代码实现雅虎 logo ACSII 动图. 运行后,你将会看到: 它是一个 20fps.抗锯齿的 Yahoo! logo ASCII 动 ...
- Linux下的C高级编程---学习
一.进程 一个正在运行的程序称为进程.例如在屏幕上正打开两个终端窗口,则说明同一个终端程序正在做为两个进程而同时执行,而每个终端窗口又都在执行shell,则每个shell又是另外一个进程 ...
- linux下C的GBD调试学习笔记(转载)
1. 单步执行和跟踪函数调用 看下面的程序: 例 10.1. 函数调试实例 #include <stdio.h> int add_range(int low, int high) { in ...
- linux下的OpenCV安装&学习笔记
http://www.linuxdiyf.com/viewarticle.php?id=20731 (本想在fedora下安装编译的,但目前opencv官网.sourceforge等网站都无法访问下载 ...
- Perl语言编程>>学习笔记2
1. Perl中变量的常用表示 ${var} 相当于 $var $Dog::days 在Dog包里面的变量$days $#days @days 的最后一个索引 ] $days 引用的数组 ...
- Perl语言编程>>学习笔记
1. 使用反引号可以调用外部程序并返回程序的输出, 如 $cwd = `pwd`; 2. Perl 中的变量类型之间的区别主要是单数和复数; 单数变量称为标量 $scalar , 复数变量称为数组 ...
随机推荐
- MVC案例
MVC案例分析: - 没有业务层,直接Servlet调用Dao,所以也没有业务操作.所有在DAO直接获取Connection对象 -采用MVCDs设计模式 -使用到的技术: mvc设计模式:JSP ...
- JAVA自学笔记(2)
Java跳跃级知识储备 1.Mathod新篇章 1.0进制转化(方法中的参数其实就是局部变量,在方法中定义的变量要赋初值) import java.util.Scanner; public class ...
- web selenium 小笔记
常用库导入 from selenium import webdriver #导入webdriver模块 from selenium.webdriver.common.by import By # XP ...
- SpringBoot—单元测试模板(controller层和service层)
介绍 概述 在开发过程中,我们经常会一股脑的写各种业务逻辑,经常等全部大功告成的时候,打个jar包放环境里跑跑看看能不能通,殊不知在各个业务方法中已经漏洞百出,修复一个打一个包,再继续修复,这种效 ...
- Python 为什么没有 main 函数?为什么我不推荐写 main 函数?
毫无疑问 Python 中没有所谓的 main 入口函数,但是网上经常看到一些文章提"Python 的 main 函数"."建议写 main 函数"-- 有些人 ...
- Mysql安装与设置用户名、密码
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 关于MySQL程序中数据库调度的流程图解: 1-MySql数据库的安装 安装前要注意,看看当前系 ...
- Java实现 蓝桥杯VIP 算法训练 无权最长链
试题 算法训练 无权最长链 问题描述 给定一个n节点m边的无圈且连通的图,求直径 输入格式 第一行两个数字n,m 接下来m行每行两个数字x,y,代表x,y之间有一条边 输出格式 要求用户的输出满足的格 ...
- Java实现蓝桥杯正则切分
java中提供了对正则表达式的支持. 有的时候,恰当地使用正则,可以让我们的工作事半功倍! 如下代码用来检验一个四则运算式中数据项的数目,请填写划线部分缺少的代码. 注意:只填写缺少代码,不要写任何多 ...
- Java实现蓝桥杯正则问题
题目描述 考虑一种简单的正则表达式: 只由 x ( ) | 组成的正则表达式. 小明想求出这个正则表达式能接受的最长字符串的长度. 例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是 ...
- java实现和为定值的两个数
1 问题描述 输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数.如果有多对数的和等于输入的整数,输出任意一对即可.例如,如果输入数组[1,2,4,5,7,11,15]和 ...