码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-06-06 19:57:38      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:hand   -1016   二位数组   handle   hello   位数组   符号   经典   编译   

技术分享

视频参看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语言编程学习笔记

标签:hand   -1016   二位数组   handle   hello   位数组   符号   经典   编译   

原文地址:http://www.cnblogs.com/kebibuluan/p/6953171.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!