linux下的c语言编程学习笔记

时间:2023-03-08 18:26:55

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

方式一:

#ifndef __SOMEFILE_H__

#define __SOMEFILE_H__

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

#endif

方式二:

#pragma once

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

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

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

指针变量存储的是地址

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

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

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

*pValue的值就0X01

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

*( pValue+1)的值是0X02

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

上面这张模式是大段存储

linux下的c语言编程学习笔记

用下面的代码就可以:

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

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

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

输出的结果是300

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

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

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

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

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

总结:

linux下的c语言编程学习笔记

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

 

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

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

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

上面是正确的相当的经典

例子2

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

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

列子3

linux下的c语言编程学习笔记

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

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

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

右值在运行的时候在知道

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

linux下的c语言编程学习笔记

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

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

linux下的c语言编程学习笔记

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

Extern的例子

linux下的c语言编程学习笔记

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

linux下的c语言编程学习笔记

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