当前位置: 首页 > news >正文

青岛网页制作网站买机票便宜网站建设

青岛网页制作网站,买机票便宜网站建设,唐山做网站优化,网站制作公司哪家专业目录 一、内存和地址 #xff08;一#xff09;内存 #xff08;二#xff09;内存单元 #xff08;三#xff09;地址 #xff08;四#xff09;拓展#xff1a;CPU与内存的联系 二、指针变量和地址 #xff08;一#xff09;创建变量的本质 #xff08;二…目录 一、内存和地址 一内存 二内存单元 三地址 四拓展CPU与内存的联系 二、指针变量和地址 一创建变量的本质 二取地址操作符 三指针变量和解引用操作符* 1、指针变量 2、指针变量的理解 1【int* pa】的理解 2【int*】的理解 3、解引用操作符* 四指针变量的大小 三、指针变量类型的意义 一解引用操作时决定可以操作多少个字节 二指针 -  整数时向前/向后走多大的区别 三void* 指针 四、const修饰指针 一const修饰变量 二const修饰指针变量 五、指针的运算 一指针 或 -  整数 二指针 - 指针 三指针的关系运算指针的比较 六、野指针 一野指针造成的原因 1、指针未初始化 2、指针越界访问 3、指针指向的空间释放 二如何规避野指针 1、指针初始化 2、小心指针越界 3、指针变量不再使用时及时置NULL指针使用之前检查有效性 4、避免返回局部变量的地址 七、assert断言 八、指针的使用和传址调用 一指针的使用strlen的模拟实现 二传值调用和传址调用 一、内存和地址 一内存 又称内存储器或主存储器计算机中所有程序的运行都在内存中进行计算机上CPU中央处理器在处理数据的时候需要的数据是在内存中读取的处理后的数据也会放回内存中这样使用内存则需要高效地管理内存空间 二内存单元 就是把内存划分为一个个的内存单元每个内存单元的大小取1个字节8个比特位每个内存单元都有⼀个编号有了这个内存单元的编号CPU就可以快速找到⼀个内存空间 三地址 在计算机中我们把【内存单元的编号】也称为【地址】C语言中给【地址】起了新的名字叫【指针】 可以理解为【内存单元的编号 地址 指针】 四拓展CPU与内存的联系 有三条总线将CPU与内存连接彼此交换数据①地址总线②数据总线③控制总线 交换过程地址信息通过【地址总线】被下达给内存在内存上就可以找到相应的数据将数据通过【数据总线】传入CPU做处理【控制总线】则负责传递对数据的操作如读操作、写操作等 二、指针变量和地址 一创建变量的本质 创建变量的本质是在内存中申请空间例如创建一个 int 变量就是向内存申请4个字节的空间每个字节都有自己的编号地址变量的名字仅仅是给程序员看的编译器不看名字编译器是通过地址找内存单元的 二取地址操作符 使用拿到变量的地址 例如 int a 10;a; a 就可以拿到变量a的地址虽然整型变量占用4个字节我们只要知道了第⼀个字节地址春藤摸瓜访问到4个字节的数据也是可行的 注当一个变量占多个内存单元的时候总会取出该变量的第一个内存单元地址较小的那个字节 三指针变量和解引用操作符* 1、指针变量 通过取地址操作符()拿到的地址是⼀个数值比如0x0012ff40这个数值有时候也是需要存储起来方便后期再使用的那我们把这样的地址值存放在哪里呢答案是指针变量中例如 #include stdio.h int main() {int a 10;int * pa a;//取出a的地址并存储到指针变量pa中return 0; } 指针变量也是⼀种变量这种变量就是⽤来存放地址的存放在指针变量中的值都会理解为地址 2、指针变量的理解 上面例子的写法中的 int *pa 拆开来理解 1【int* pa】的理解 ①【int *】是变量pa的类型 ② pa是一个变量用来存放地址指针的所以pa又叫指针变量 2【int*】的理解 ① * 表示pa是指针变量 ② int 表示【pa 指针变量中保存的地址】所指向的【变量 a】的类型是int 3、解引用操作符* 又称为间接访问操作符用法 如下演示 int main() {int a 100;int* pa a;*pa 0;此处*pa a相当于对a进行修改return 0; }         总结通过【指针变量pa】找到指向的变量a—— *pa通过pa的值找到a         ① pa —— 指针变量         ② pa —— 指针变量pa的地址         ③ *pa —— pa指向的变量a 四指针变量的大小         【指针变量类型的大小】取决于【地址的大小】而地址大小由计算机是32位操作系统还是64位操作系统决定         ① 指针变量是用来存放地址的一个地址的存放需要多大空间那么指针变量类型就是多大所以32位平台总共有32根地址总线每根线的电信号转化成数字信号后是1或0那我们把32根地址总线产生的2进制序列作为一个地址那么一个地址就是32个比特位就是4个字节同理在64位的机器中一个地址的大小就是8字节         ② 地址的大小与【指向的原变量的类型大小】无关就是4字节或者8字节 #include stdio.h//指针变量的⼤⼩取决于地址的⼤⼩ //32位平台下地址是32个bit位即4个字节 //64位平台下地址是64个bit位即8个字节int main() {printf(%zd\n, sizeof(char *));printf(%zd\n, sizeof(short *));printf(%zd\n, sizeof(int *));printf(%zd\n, sizeof(double *));return 0; }         X86环境输出结果如下         X64环境输出结果如下         结论 • 32位平台下地址是32个bit位指针变量大小是4个字节 • 64位平台下地址是64个bit位指针变量大小是8个字节 • 指针变量的大小和类型是无关的只要指针类型的变量在相同的平台下大小都是相同的 三、指针变量类型的意义 指针变量的大小和类型无关只要是指针变量在同⼀个平台下大小都是⼀样的都是4字节或者8字节为什么还要有各种各样的指针类型呢 一解引用操作时决定可以操作多少个字节 如下演示 #include stdio.h int main() {int a 0x11223344;int* p a;*p 0;return 0; } 变量a的地址与4个字节的值如下 经过 *p 0的语句后4个字节的值全部改为0如下 若代码中指针变量的类型改为char* #include stdio.h int main() {int a 0x11223344;char* p a;*p 0;return 0; } 变量a的地址与4个字节的值如下 经过 *p 0的语句后4个字节的值只有一个字节改为0如下 结论指针的类型决定了解引用操作时决定可以操作多少个字节 比如 char* 的指针解引用就只能访问一个字节而 int* 的指针的解引用就能访问四个字节 二指针 -  整数时向前/向后走多大的区别 如下代码演示 #include stdio.h int main() {int n 10;char *pc (char*)n;int *pi n;printf(%p\n, n);printf(%p\n, pc);printf(%p\n, pc1);printf(%p\n, pi);printf(%p\n, pi1);return 0; } 代码结果如下 从结果可以得出char* 类型的指针变量1跳过1个字节 int* 类型的指针变量1跳过了4个字节 结论指针的类型决定了指针向前或者向后走一步有多大距离            补充         int* pa;            pa1—— 1 * sizeof (int)         pan—— n * sizeof (int)         char* pa;            pa1—— 1 * sizeof (char)         pan—— n * sizeof (char) 总结         类型* 变量名         变量名 1 —— 1 * sizeof指针指向的变量类型 三void* 指针 void* ——无具体类型的指针泛型指针 可以接收任何类型的地址但是正因为他是泛型指针所以没有特定类型指针的用法即无法解引用和进行指针的 - 操作 作用⼀般 void* 类型的指针是使用在函数参数的部分用来接收不同类型数据的地址这样的设计可以实现泛型编程的效果使得⼀个函数来处理多种类型的数据 四、const修饰指针 一const修饰变量 const修饰变量的时候叫常变量 本质还是变量只是不能被修改 变量是可以修改的如果把变量的地址交给⼀个指针变量通过指针变量的也可以修改这个变量若不想变量被直接修改就使用const修饰变量起限制作用 #include stdio.h int main() {int m 0;m 20;//m是可以修改的const int n 0;n 20;//n是不能被修改的return 0; } 上述代码中n是不能被修改的其实n本质是变量无法在数组长度中使用只不过被const修饰后在语法上加了限制只要我们在代码中对n进行修改就不符合语法规则就报错致使没法直接修改n 但是可以拿到n的地址通过指针对它进行修改但这是在打破语法规则 int main() {const int n 0;printf(n %d\n, n);int*p n;*p 20;printf(n %d\n, n);return 0; } 结果如下 这里的初衷是不让变量改变但是通过指针还是能打破const的限制接下来就要对这一象限改进直接对指针变量做const限制 二const修饰指针变量 ⼀般来讲const修饰指针变量可以放在 * 的左边也可以放在 * 的右边意义是不⼀样的 int * p;//没有const修饰 int const * p;//const 放在*的左边做修饰 int * const p;//const 放在*的右边做修饰 如下代码演示 代码一 int a 10; int b 20 int const * p a;*p 200err p b√ 代码一分析 这个const限制的是 *p即p指向的变量a不能改变但是并没有限制p所以可以修改p所指向的变量         放在*的左边限制的是指针指向的内容也就是不能通过指针变量来修改它所指的内容但是指针变量本身可以改变的 代码二 int a 10; int b 20 int * const p a;*p 200√ p berr 代码二分析 放在*的右边限制的是指针变量本身也就是指针变量本身不可以改变但可以通过指针变量来修改它所指的内容 结论const修饰指针变量的时候 const如果放在 * 的左边修饰的是【指针指向的内容 *p】保证指针指向的内容不能通过指针来改变但是【指针变量本身 p】的内容可变 const如果放在*的右边修饰的是【指针变量本身 p】保证了指针变量的地址指向不能修改但是【指针指向的内容*p】可以通过指针改变 五、指针的运算 指针的基本运算有三种分别是 • 指针 或 -  整数 • 指针 - 指针 • 指针的关系运算指针的比较 一指针 或 -  整数 因为数组在内存中是连续存放的只要知道第⼀个元素的地址顺腾摸瓜就能找到后⾯的所有元素 int arr[10] {1,2,3,4,5,6,7,8,9,10}; #include stdio.h //指针- 整数 int main() {int arr[10] {1,2,3,4,5,6,7,8,9,10};int *p arr[0];int sz sizeof(arr)/sizeof(arr[0]);for(int i 0; i sz; i){printf(%d , *(pi));//pi 这⾥就是指针整数}return 0; } 注意指针运算是指对 p 进行运算而不是对*p若对 *p 运算就是对变量a运算了 在数组中指针能够“顺腾摸瓜”的原因是 ①指针类型决定了【指针1】的步长和指针解引用之后的权限 ②数组在内存中的地址是连续的 错误演示代码 int main() {int arr[10] {1,2,3,4,5,6,7,8,9,10};char *p arr[0];int sz sizeof(arr)/sizeof(arr[0]);for(int i 0; i sz; i){printf(%d , *p);p 4}return 0; } 代码分析 每次打印时都让p 4在打印1~10时恰好正确 每次访问都只会访问第一个字节后面三个字节是直接跳过的所以两位数的时候是正确的但是数字大一些就会忽略掉第二个字节的数字就会出错 二指针 - 指针 【指针 - 指针】的运算前提条件是两个指针指向的是同一个空间否则运算无意义 指针 - 指针的【绝对值】是指针和指针之间【元素的个数】 应用求字符串长度 如下代码演示 #include stdio.hint my_strlen(char *s) {char *p s;//设置尾指针while(*p ! \0 )p;return p-s; }int main() {printf(%d\n, my_strlen(abc));return 0; } 拓展指针 指针 答无意义类似于 【日期 - 天数计算日期】、【日期 - 日期算的是两个日期之间差多少天】有意义而【日期 日期】无意义 三指针的关系运算指针的比较 应用做判断条件使用数组中若一个地址小于另一个地址则执行语句 #include stdio.hint main() {int arr[10] {1,2,3,4,5,6,7,8,9,10};int *p arr[0];int sz sizeof(arr)/sizeof(arr[0]);while(parrsz) //指针的⼤⼩⽐较{printf(%d , *p);p;}return 0; } 六、野指针 概念 野指针就是指针指向的位置是不可知的随机的、不正确的、没有明确限制的 一野指针造成的原因 1、指针未初始化 指针变量也是局部变量不初始化就会给随机值 如果将未初始化的指针变量的值作为地址来进行解引用操作就会形成非法访问 #include stdio.hint main() { int *p;//局部变量指针未初始化默认为随机值*p 20;return 0; } 2、指针越界访问 #include stdio.hint main() {int arr[10] {0};int *p arr[0];int i 0;for(i0; i11; i){//当指针指向的范围超出数组arr的范围时p就是野指针*(p) i;}return 0; } 3、指针指向的空间释放 #include stdio.hint* test() {int n 100;return n; }int main() {int* p test();printf(%d\n, *p);return 0; } 二如何规避野指针 1、指针初始化 如果明确知道指针指向哪里就直接赋值地址如果不知道指针应该指向哪里可以给指针赋值NULLNULL 是C语言中定义的⼀个标识符常量值是0这个0在C语言中会被强制转化为void*类型0也是地址这个地址是无法使用的读写该地址会报错 演示代码如下 #include stdio.h int main() {int num 10;int* p1 num;int* p2 NULL;return 0; } 2、小心指针越界 ⼀个程序向内存申请了哪些空间通过指针也就只能访问哪些空间不能超出范围访问超出了就是越界访问 3、指针变量不再使用时及时置NULL指针使用之前检查有效性 当指针变量指向⼀块区域的时候我们可以通过指针访问该区域后期不再使用这个指针访问空间的时候我们可以把该指针置为NULL因为约定俗成的⼀个规则就是只要是NULL指针就不去访问同时使用指针之前可以判断指针是否为NULL 演示代码如下 int main() {int arr[10] {1,2,3,4,5,6,7,8,9,10};int *p arr[0];for(int i 0; i10; i){*(p) i;}//此时p已经越界了可以把p置为NULLp NULL;//下次使⽤的时候判断p不为NULL的时候再使⽤//...p arr[0];//重新让p获得地址if(p ! NULL) //判断{//...}return 0; } 4、避免返回局部变量的地址 不要返回局部变量的地址 七、assert断言 assert.h 头文件定义了宏 assert ( ) 用于在运行时确保程序符合指定条件如果不符合就报错终止运行这个宏常常被称为“断言” 使用#include assert.hassert表达式 作用判断是否符合指定条件如果不符合就会终止运行【通常用来判断指针变量的有效性】 判断判断为真则程序继续向下走判断为假则报错 int* p NULL; ... assertp ! NULL; 此处经过一些列的代码后若 p 不等于NULL则正常运行下去若还是等于NULL则程序报错终止运行 若想取消assert断言则在#include assert.h上面 #define NDEBUG assert断言只在Debug版本中有效在Release版本中会被优化掉 缺点引入了额外的检查增加了程序的运行时间 八、指针的使用和传址调用 一指针的使用strlen的模拟实现 库函数strlen的功能是求字符串⻓度统计的是字符串中 \0 之前的字符的个数 函数原型如下 size_t strlen ( const char * str ); 参数str接收⼀个字符串的起始地址然后开始统计字符串中 \0 之前的字符个数最终返回长度 如果要模拟实现只要从起始地址开始向后逐个字符的遍历只要不是 \0 字符计数器就1这样直到 \0 就停止代码如下 size_t my_strlen(const char * str) {int count 0;assert(str);//为了保险判断传来的是不是空地址while(*str){count;str;}return count; }int main() {size_t len my_strlen(abcdef);printf(%zd\n, len);return 0; } 注代码中的 const不希望原值被修改和 assert保险判断来加强代码使用时的健壮性鲁棒性   二传值调用和传址调用 传址调用可以让函数和主调函数之间建立真正的联系在函数内部可以修改主调函数中的变量所以未来函数中只是需要主调函数中的变量值来实现计算就可以采用传值调用如果函数内部要修改主调函数中的变量的值就需要传址调用         以上内容仅供分析若有错误请多多指正
http://www.w-s-a.com/news/770800/

相关文章:

  • 找个为公司做网站的手机端原神
  • 邯郸手机建站价格公众号开发者权限哪里添加
  • wordpress模板电子书下载站微信app官方免费下载
  • 从哪些方面进行网站建设如何做网站的实时画面
  • 设计网站公司收费西安小程序开发公司有哪些
  • 如何建网站赚取佣金哪个网站可以做免费宣传
  • 万网手机网站seo方法
  • 免费制作网站app百度首页纯净版
  • 支持api网站开发wordpress排版Markdown
  • 赤峰做网站的logo设计软件在线制作
  • iis网站批量导入苏州最新新闻事件今天
  • 甘肃省住房和城乡建设厅注册中心网站首页沈阳专业关键词推广
  • 网站怎么能在百度搜到网站开发费怎么做会计分录
  • 嘉定专业网站制作公司七星彩网站开发
  • 网站建设人员培训企业网站开发模型图
  • 自己开发一个网站应该怎么做国外设计网站 绿色的
  • 南昌外贸网站设计推广任务发布平台app
  • 建立网站成本书店网站建设可行性分析
  • 高端网站设计官网乌海学校网站建设
  • 哪些网站适合新手编程做项目优秀网页设计赏析
  • 永州网站seo德阳网站建设优化
  • 网站建设高端网站本地建设网站软件下载
  • 网站后台账号密码破解杭州酒店网站设计公司推荐
  • 和县网站开发秦皇岛建设工程信息网站
  • 国外网站用什么dns好建一个下载网站要什么cms系统
  • 礼品工艺品网站建设手机做网站哪家好
  • 泉州网站建设方案维护怎样选择网站建设
  • 江苏建站速度忿先进的网站建设
  • 广州天河建站公司com域名注册多少钱
  • 成都网站建设推广好vs2013如何做网站