黄页网站代码高校网站安全建设方案
2026/3/4 12:33:37 网站建设 项目流程
黄页网站代码,高校网站安全建设方案,沁阳建网站,seo的站外优化流程文章目录 一、内存和地址二、指针变量和地址2.1 取地址操作符 2.2 创建指针变量2.3 使用指针变量 三、指针变量类型的意义3.1 指针的解引用3.2 void* 指针 四、指针运算4.1 指针 - 整数4.2 指针 - 指针4.3 指针的关系运算 五、const修饰指针5.1 const 修饰变量5.2 const修…文章目录一、内存和地址二、指针变量和地址2.1 取地址操作符 2.2 创建指针变量2.3 使用指针变量三、指针变量类型的意义3.1 指针的解引用3.2 void* 指针四、指针运算4.1 指针 - 整数4.2 指针 - 指针4.3 指针的关系运算五、const修饰指针5.1 const 修饰变量5.2 const修饰指针变量六、野指针6.1野指针的成因6.1.1 指针未初始化6.1.2 指针越界访问6.1.3 指针指向的空间释放6.2 如何避免野指针6.2.1 指针初始化6.2.2 小心指针越界6.2.3 避免返回局部变量的地址七、assert断言八、传值调用和传址调用8.1 传值调用8.2 传值调用一、内存和地址在计算机处理数据的时候数据都需要先从内存当中读取出来处理完后的数据还需放回内存当中那么从内存中拿取数据处理完后又该如何放回到原来的空间呢我们都知道在我们购买电脑的时候有8G、16G、32G等更高的内存那么这些内存空间如何高效的管理呢其实也就是把整个内存单元逻辑划分为多个小的内存单元每个小的内存单元占1个字节而每个小的内存单元都有一个独属于自己的地址这些地址就像是一个个房间的门牌号正是有了这些’‘门牌号’计算机才能够准确且高效的对数据进行查找处理处理完后再准确的放回二、指针变量和地址有了上面的概念后我们就能更好的理解在C语言中创建一个变量其实就是向内存中申请一块空间这片空间是这个变量独属的比如当创建一个int类型的变量a的时候就会向内存申请一块四个字节的空间用于存放int类型的变量a![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/67f6188848504469b45d37892886adf1.png当我们想要取出a的地址的时候需要使用到一个操作符——取地址操作符 ’ ’2.1 取地址操作符 ‘’a取出的地址是a所占的四个字节中地址较小的那一个字节的地址2.2 创建指针变量当我们想要将取出来的a的地址存放起来的时候就需要创建一个指针变量指针变量就是用来存放地址的变量所占大小为4个字节(x86环境)或8个字节(x64环境)int a 5; int* p a;//创建一个指针变量pint表示取地址的对象a为int类型所以在我们创建一个指针变量时要根据取地址的对象的类型来确定指针变量的类型,而’ * 表示该变量为指针变量2.3 使用指针变量当我们创建了a的指针变量后我们要通过p对a的值进行操作的时候就需要用到 ’ * ‘解引用操作符解引用操作符’ * ‘不同于创建指针变量时所使用的’ * ,一个是对指针变量p的说明一个是对指针变量p的解引用例如:#includestdio.hintmain(){inta5;int*pa;*p10;//通过指针变量p,将a的值修改为10printf(%d,a);return0;}为什么通过指针变量p能够更改a的值呢其实是因为p存放的就是a的地址对p解引用后进行操作就是对a进行操作三、指针变量类型的意义3.1 指针的解引用指针变量的大小和类型无关在同一平台下同一环境中指针变量的大小都是相同的既然大小都相同为什么还要有各种各样的指针类型呢其实指针类型是有特殊的含义的当指针类型不同时所能操作的字节数也可能不同例如://代码1:#includestdio.hintmain(){inta0x11223344;int*p1a;*p10;printf(%d,a);}//代码2:#includestdio.hintmain(){inta0x11223344;char*p1a;*p10;printf(%d,a);}当我们运行这两个代码的时候就会发现:代码1会将a的4个字节全部改成0而代码2只会将a的第一个地址改为0由此我们可以得到一个结论指针的类型决定了对指针解引用时有多大的权限(一次能够操作多少个字节)就比如上方的代码:int* 的指针解引用就能访问一个字节而char*的指针解引用只能访问1个字节3.2 void* 指针在指针类型中还有一种特殊的指针类型——void* 类型的指针可以理解为无具体类型的指针(或者叫泛型指针)这种类型的指针可以用来接收任意类型地址。但是也有局限性void*类型的指针不能直接进行指针的±整数和解引用的运算例如#includestdio.hintmain(){inta0x11223344;void*pa;*p10;printf(%d,a);}当我们运行这段代码时编译器就会报错那么void* 的指针到底有什么用呢一般void* 类型的指针时使用在函数参数部分用来接收不同类型的数据的地址这样设计可以实现泛型编程的效果。使得一个函数可以用来处理多种类型的数据四、指针运算4.1 指针 - 整数因为数组在内存种是连续存储的所以当我们知道首元素地址的时候就可以根据首元素地址整数从而找到后面的元素例如:#includestdio.hintmain(){intarr[]{1,2,3,4,5,6,7,8,9};int*parr;//数组名数组首元素地址intszsizeof(arr)/sizeof(arr[0]);inti0;for(i0;isz;i){printf(%d ,*(pi));//指针整数}}通过上面的代码就能打印出数组arr中所有的元素需要注意的是指针变量±指针跳过的字节数跟指针类型有关比如一个int类型的指针变量1就是跳过4个字节一个char类型的指针变量1就是跳过1个字节所以在进行指针±运算时一定要正确的判断该使用哪种类型的指针变量4.2 指针 - 指针当我们需要求一个字符串的长度的时候就可以使用指针-指针运算#includestdio.hsize_tmy_strlen(char*ps1){char*ps2ps1;while(*ps2!\0){ps2;}returnps2-ps1;}intmain(){chars[]abcdefg;size_tretmy_strlen(s);printf(%zu\n,ret);return0;}4.3 指针的关系运算#includestdio.hintmain(){chars[]abcdefg;char*p1s;char*p2s[1];if(p1p2)//p1和p2两个地址相比较看哪个地址更大{printf();}else{printf();}return0;}五、const修饰指针5.1 const 修饰变量const用于给变量加上限制使得该变量无法被改变例如:#includestdio.hintmain(){constinta10;a20;}当我们对被const修饰的变量进行修改时编译器就会报错5.2 const修饰指针变量const修饰指针变量可以放在’ * ‘的左边也可以放在’ * ‘的右边当const放在’ * 左边的时候指针所指向的内容被限制了不能通过指针对指针指向的内容进行修改但是指针变量本身的值可以修改指针变量本身的值可以修改#includestdio.hintmain(){inta10;intb20;constint*pa;pb;printf(%d\n,*p);}当const放在’ * ‘右边的时候修饰的是指针变量本身保证了指针变量本身不能够被修改但是指针指向的内容可以被修改当然const也可以同时存在与’ * 的左右两边表示该指针变量本身和所指向的内容都不能被修改六、野指针野指针就是指向的位置是不可以预知的(随机的、不正确的、没有明确限制的)6.1野指针的成因6.1.1 指针未初始化#includestdio.hintmain(){int*p;*p20;printf(%p\n,*p);}像这样不初始化指针变量而直接使用时编译器就会报错6.1.2 指针越界访问假设一个数组有10个元素我们创建一个指针变量p把数组首元素地址放进p里面然后*(p10)这样就会出现指针越界访问的问题因为整个数组一共就只有十个元素我们对*(p10)其实就是指向了第11个元素这样就超出了数组arr的范围这就使得p成为了野指针并且p所指向的内容是未知的6.1.3 指针指向的空间释放#includestdio.hint*test(){intn100;returnn;}intmain(){int*ptest();printf(%d,*p);}当出test函数时局部变量所申请的空间会返还给内存6.2 如何避免野指针6.2.1 指针初始化当我们明确知道创建的指针需要指向哪里的时候我们就可以直接对该指针变量进行赋值而当我们需要创建一个指针但还不知道这个指针需要指向哪里的时候可以先赋值NULL。NULL指针是C语言所定义的一个标识符常量值是0这个地址是无法使用的读写该地址会报错int* p NULL;6.2.2 小心指针越界一个程序向内存申请了哪些空间通过指针也只能访问那些空间不能超出访问范围超出了就是越界访问6.2.3 避免返回局部变量的地址当我们调用一个函数时不要使用该函数所返回的指向该函数内部局部变量的地址七、assert断言assert.h头文件定义了宏assert(),用于在运行时确保程序符合指定的条件如果不符合就报错中职运行。这个宏常常被称为断言例如:八、传值调用和传址调用设计一个函数用于交换a和b的值8.1 传值调用运行这个代码后发现a和b的值并没有成功交换为什呢其实是因为a和b的值传递给了Swap函数Swap函数内部创建了x和y两个变量用于接收a和b的值但是当我们分别打印x、y和a、b的地址的时候就会发现他们对应的地址并不相同也就是说x、y其实是独立的空间对该空间进行修改并不会影响到a、b的值所以当Swap函数调用完返回main函数后a和b的值并没有交换8.2 传值调用因此当我们想要交换两个值的时候就需要用到传址调用把两个参数对应的地址传递给Swap函数Swap函数用两个指针变量来进行接收这样,对x和y的修改也会影响到a和b传址调用可以让函数与主函数之间建立真正的联系在函数内部可以修改主调函数中的变量所以在以后写代码时只是需要主调函数中的变量来实现计算的时候就可以采用传值调用如果函数内部要修改主调函数中变量的值就需要使用传址调用完

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询