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

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

时间: 2024-10-13 17:16:34

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

linux下的c语言编程删除文件夹

刚刚在学习开始做新项目的时候,学长布置了一项任务,就是在给定一个目录下,要将这个目录下一个星期之前的目录包括里面的文件全部删除,只保留这一个星期内的.百度了好久的资料,终于完成,记录一下防止忘记.(注:文件夹名称默认为日期格式,如20140716) #include<dirent.h> #include<sys/types.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #i

在Linux下开始C语言的学习

为什么要在linux下学习C语言? linux下可以体验到最纯粹的C语言编程,可以抛出其他IDE的影响 环境配置简单,一条命令就足够.甚至对于大多数linux发行版本,都已经不需要配置C语言的环境 查手册方便,在Linux下如果你不清楚一个库函数的用法,直接man,还锻炼英语了.如果想了解man,那就先man man. OK,let's star! 第一步,打开terminal,先输入vi hello.c新建一个c的源文件 接着我们就进入了VIM编辑器,写一段helloworld的代码吧 输入:

Perl语言编程&gt;&gt;学习笔记

1. 使用反引号可以调用外部程序并返回程序的输出, 如  $cwd = `pwd`; 2. Perl 中的变量类型之间的区别主要是单数和复数; 单数变量称为标量 $scalar , 复数变量称为数组 @array .   Perl中还有 Hash, Handle, typeglob 和引用 等一些变量类型.  Perl中的标量可以使用 = 赋值, 可以指向其他变量或对象等等复杂数据结构的引用. 3.Perl中的引用 $ary = \@myarray; # 引用一个命名数组 $hsh = \%my

转 学习linux下的c/c++编程

http://blog.csdn.net/byxdaz/article/details/3959680 1,先有linux环境搭minGW和cygwin都有点麻烦,最最简单的办法还是装个真正的linux,用虚拟机也好,在网络上的另一台机器也好.这样不仅快,而且你有了真正的环境.2.会C/C++语言(估计你会的)3.入门阶段熟悉gcc命令行,最基本的参数,如,-g,-W,-O,-o,-c 建议看man gcc(很大找想要的)4.编译第一个helloworld程序: 基本命令 gcc hellowo

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]

linux网络编程学习笔记之五 -----并发机制与线程?

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我仅仅是举几个样例作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.能够在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理须要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也非常easy,在主线程中定时,定

linux网络编程学习笔记之四 -----多线程并发服务端

相对于使用进程实现并发,用线程的实现更加轻量.每个线程都是独立的逻辑流.线程是CPU上独立调度运行的最小单位,而进程是资源分配的单位.当然这是在微内核的操作系统上说的,简言之这种操作系统的内核是只提供最基本的OS服务,更多参看点击打开链接 每个线程有它自己的线程上下文,包括一个唯一的线程ID(linux上实现为unsigned long),栈,栈指针,程序计数器.通用目的寄存器和条件码,还有自己的信号掩码和优先级.同一个进程里的线程共享这个进程的整个虚拟地址空间,包括可执行的程序文本.程序的全局

linux网络编程学习笔记之五 -----并发机制与线程池

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我只是举几个例子作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.可以在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理需要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也很简单,在主线程中定时,定时到期,

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str