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

活动 网站 源码关键词搜索爱站

活动 网站 源码,关键词搜索爱站,中国建设招投标网,潜江新闻网内存和地址 讲解这个之前要先明确指针的概念,举个例子,在居民楼中,如果你要找个人并且有他的门牌号,是不是就能快速找到他住的房间,对应到计算机中,cpu处理的数据是需要在内存中读取的,内存的…

内存和地址

讲解这个之前要先明确指针的概念,举个例子,在居民楼中,如果你要找个人并且有他的门牌号,是不是就能快速找到他住的房间,对应到计算机中,cpu处理的数据是需要在内存中读取的,内存的管理也是同房间号一样划分成一个个内存单元,每个内存单元就和门牌号一样有一个编号,生活中我们把门牌号叫做地址,计算机中内存单元的编号也叫做地址,c语言中给地址取了一个新名字:指针。

所以我们可以理解为

        内存单元的编号=地址=指针

指针变量和地址

        取地址操作符(&)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {int a = 10;printf("%p", &a);//输出a的地址return 0;
}

 看一下运行结果

但int a毫无疑问是占4个字节的,&a所输出的是a所占4个字节中地址较小的字节

指针变量

我们通过上面的&a得到的地址是一个数值,那这样的数值就可以放在指针中方便使用

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {int a = 10;int* q = &a;//取出a的地址存放在指针q中return 0;
}

使用指针变量就是一种存放地址的变量,存放在其中的值都会被理解为地址 

指针的类型
int a = 10;
int* q = &a;

 q左边写的是int*,其中*代表q是一个指针变量,*前面的int是说明q指向的是一个int类型的对象

 

解引用操作符(*)

将地址保存进指针之后,如何取出来使用呢,

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {int a = 10;int* q = &a;*q = 0;return 0;
}

 *q的意思就是通过q中存放的地址,找到指向的空间,*q其实就是a变量了,使用*q=0,就是把a变量改成了0,这样对a的修改就多了一种途径,能够更灵活的使用。

指针变量的大小

在32位平台地址就是32bit,指针变量大小为4个字节

在64位平台地址就是64bit,指针变量大小为8个字节

指针变量大小与类型无关,在相同平台下,大小都是相同的

指针变量类型的意义

指针的解引用

指针变量的类型虽然与大小无关,但它还是有意义的,它决定了对指针解引用的时候有多大的权限(一次能操作几个字符),如char*的指针解引用只能访问一个字节,int*的指针解引用就能访问4个字节

指针加减整数
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {int a = 1;char* q = (char*) & a;int* w = &a;printf("&a   = %p\n",&a);printf("&q   = %p\n",&q);printf("&q+1 = %p\n",&q+1);printf("&w   = %p\n",&w);printf("&w+1 = %p\n",&w+1);return 0;
}

运行结果如下

 

可以看到char*类型的指针变量+1跳过一个字节,int*的指针变量跳过了4个字节,这就是指针类型差异带来的变化 

const修饰指针

如果希望指针变量不被修改

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {int a = 1;//a是可修改的const int w = 1;//w是不可修改的return 0;
}

 如果加上const再想修改w,程序就会直接报错

但如果绕过w,使用w的地址去修改w就可以

#include <stdio.h>
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如果放在*右边,修饰的是指针变量本身,保证指针变量的内容不能修改,但指针指向的内容可以修改

指针运算

指针加减整数 

因为数组在内存中是连续存放的,只要知道头元素的地址,就能找到后面的全部元素

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {int arr[5] = {1,2,3,4,5};
}

 下面是一个指针加减整数的例子

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = &arr[0];int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){printf("%d ", *(p + i));//指针+整数}return 0;
}

 

可以看到循环正常输出,*(p+i)其实等同与arr【i】 

指针减指针
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int my_strlen(const char* s){const char* p = s;while (*p != '\0')p++;//最终p指向了\0//s还是指向字符串“abc”首元素a的地址return p - s;//返回的就是\0前的元素个数
}
int main(){printf("%zd\n", my_strlen("abc"));return 0;
}

 

所以可知指针-指针的绝对值是指针和指针之间的元素个数(大地址减去小地址得到的是正数,小地址减去大地址得到的是负数 )

野指针

野指针就是指针指向的位置是不可知的


野指针成因
1.指针未初始化
#include <stdio.h>
int main(){ int *p;//局部变量指针未初始化为随机值*p = 20;return 0;
}
2. 指针越界访问
#include <stdio.h>
int main(){int arr[10] = {0};
int *p = &arr[0];int i = 0;for(i=0; i<=11; i++){//当指针指向的范围超出数组arr的范围时,p就是野指针*(p++) = i;}return 0;
}

指针虽然可以指向未知的空间不会报错,但是你要是要操作那块空间就有可能会报错(因为越界访问了) 

3. 指针指向的空间释放
#include <stdio.h>
int* test(){int n = 100;return &n;
}
int main(){int*p = test();printf("%d\n", *p);return 0;
}

 如此也能输出100

 

如何规避野指针
指针初始化

如果明确知道指针指向哪⾥就直接赋值地址,如果不知道指针应该指向哪⾥,可以给指针赋值NULL.

初始化如下:

#include <stdio.h>
int main()
{int num = 10;int*p1 = &num;int*p2 = NULL;return 0;
}
注意指针是否越界 
⼀个程序只能通过指针访问自己申请的空间,不能超出范围访问,超出了就是越界访问
指针变量不再使用时,及时置NULL,指针使用之前检查有效性

assert断言

assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报
错终止运行。这个宏常常被称为“断⾔”。
assert(p != NULL);
上⾯代码在程序运⾏到这⼀⾏语句时验证变量 p 是否等于 NULL 。如果确实不等于 NULL ,程序 继续运⾏,否则就会终⽌运⾏,并且给出报错信息提示

assert() 宏接受⼀个表达式作为参数。如果该表达式为真(返回值⾮零), assert() 不会产⽣任何作⽤,程序继续运⾏。如果该表达式为假(返回值为零), assert() 就会报错,在标准错误流 stderr 中写⼊⼀条错误信息,显⽰没有通过的表达式,以及包含这个表达式的⽂件名和行号。

使⽤ assert() 它不仅能⾃动标识⽂件和出问题的行号,还有⼀种⽆需更改代码就能开启或关闭 assert() 的机制。如果已经确认程序没有问 题,不需要再做断⾔,就在 #include <assert.h> 语句的前⾯,定义⼀个宏 NDEBUG

#define NDEBUG
#include <assert.h>

如果程序⼜出现问题可以移除这条 #define NDBUG 指令,就重新启⽤了 assert() 语句。

指针的使用和传址调用

有没有什么问题是非指针不可的呢

#include <stdio.h>
void Swap1(int x, int y){int tmp = x;x = y;y = tmp;
}
int main(){int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("交换前:a=%d b=%d\n", a, b);Swap1(a, b);printf("交换后:a=%d b=%d\n", a, b);return 0;
}

 这是一个交换两个整形变量的函数,但如果运行的话

并没有任何效果,调试看看

我们发现在main函数内部,创建了a和b,a的地址是0x00cffdd0,b的地址是0x00cffdc4,在调用
Swap1函数时,将a和b传递给了Swap1函数,在Swap1函数内部创建了形参x和y接收a和b的值,但是 x的地址是0x00cffcec,y的地址是0x00cffcf0,x和y确实接收到了a和b的值,不过x的地址和a的地址不 ⼀样,y的地址和b的地址不⼀样,相当于x和y是独立的空间,那么在Swap1函数内部交换x和y的值, 自然不会影响a和b,当Swap1函数调⽤结束后回到main函数,a和b的没法交换。Swap1函数在使用的时候,是把变量本⾝直接传递给了函数,这种调⽤函数的⽅式我们之前在函数的时候就知道了,这种叫传值调用。
结论:实参传递给形参的时候,形参会单独创建⼀份临时空间来接收实参,对形参的修改不影响实
参。
所以Swap是失败的了。
更改一下
使用指针,在main函数中将a和b的地址传递给Swap函数,Swap函数里边通过地址间接的操作main函数中的a和b,并达到交换的效果
#include <stdio.h>
void Swap2(int*px, int*py){int tmp = 0;tmp = *px;*px = *py;*py = tmp;
}
int main(){int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("交换前:a=%d b=%d\n", a, b);Swap1(&a, &b);printf("交换后:a=%d b=%d\n", a, b);return 0;
}

看下结果

我们可以看到实现成Swap2的方式,顺利完成了任务,这里调用Swap2函数的时候是将变量的地址传递给了函数,这种函数调用方式叫:传址调用。
传址调用,可以让函数和主调函数之间建立真正的联系,在函数内部可以修改主调函数中的变量;所以未来函数中只是需要主调函数中的变量值来实现计算,就可以采用传值调用。如果函数内部要修改主调函数中的变量的值,就需要传址调用

文章转载自:
http://dinncoafterglow.ssfq.cn
http://dinncoassertive.ssfq.cn
http://dinncosearchless.ssfq.cn
http://dinncoparthenogenone.ssfq.cn
http://dinncoisker.ssfq.cn
http://dinncotootsy.ssfq.cn
http://dinncokidlet.ssfq.cn
http://dinncobeltsville.ssfq.cn
http://dinncosirocco.ssfq.cn
http://dinncodisenthral.ssfq.cn
http://dinncomaleficence.ssfq.cn
http://dinncocobdenite.ssfq.cn
http://dinncosabre.ssfq.cn
http://dinncorowland.ssfq.cn
http://dinncofraternize.ssfq.cn
http://dinncowaffie.ssfq.cn
http://dinncopiece.ssfq.cn
http://dinncohesychast.ssfq.cn
http://dinncoeleusinian.ssfq.cn
http://dinncocorded.ssfq.cn
http://dinncodigestible.ssfq.cn
http://dinncosalpingian.ssfq.cn
http://dinncoflibbertigibbet.ssfq.cn
http://dinncorheumatiz.ssfq.cn
http://dinncosubdued.ssfq.cn
http://dinncoliabilities.ssfq.cn
http://dinncomixt.ssfq.cn
http://dinncometaphysicize.ssfq.cn
http://dinncons.ssfq.cn
http://dinncodisfiguration.ssfq.cn
http://dinncobimana.ssfq.cn
http://dinnconoumenon.ssfq.cn
http://dinncolutestring.ssfq.cn
http://dinncotryptophan.ssfq.cn
http://dinncoautointoxication.ssfq.cn
http://dinncorabbinate.ssfq.cn
http://dinncohippogriff.ssfq.cn
http://dinncoagiotage.ssfq.cn
http://dinncoscotticise.ssfq.cn
http://dinncotourcoing.ssfq.cn
http://dinncobishop.ssfq.cn
http://dinncohorsejockey.ssfq.cn
http://dinncochatty.ssfq.cn
http://dinncocommendable.ssfq.cn
http://dinncovindicative.ssfq.cn
http://dinncotaxable.ssfq.cn
http://dinncoimposturing.ssfq.cn
http://dinncovampirism.ssfq.cn
http://dinncoresistojet.ssfq.cn
http://dinncooakling.ssfq.cn
http://dinncocornada.ssfq.cn
http://dinncoindefensible.ssfq.cn
http://dinncoendosulfan.ssfq.cn
http://dinncowgmc.ssfq.cn
http://dinncofense.ssfq.cn
http://dinncopodzolise.ssfq.cn
http://dinncotutenag.ssfq.cn
http://dinncostabilization.ssfq.cn
http://dinncovest.ssfq.cn
http://dinncopetalage.ssfq.cn
http://dinncowindsail.ssfq.cn
http://dinncoachromate.ssfq.cn
http://dinncorawish.ssfq.cn
http://dinncopopshop.ssfq.cn
http://dinncodisannexation.ssfq.cn
http://dinncoimmortally.ssfq.cn
http://dinncohylic.ssfq.cn
http://dinncoirrefutable.ssfq.cn
http://dinncosikkim.ssfq.cn
http://dinncoarcady.ssfq.cn
http://dinnconsb.ssfq.cn
http://dinncoabskize.ssfq.cn
http://dinncodoz.ssfq.cn
http://dinncomannish.ssfq.cn
http://dinncohostie.ssfq.cn
http://dinncotransmountain.ssfq.cn
http://dinncoexcoriation.ssfq.cn
http://dinncocordate.ssfq.cn
http://dinncosarcophilous.ssfq.cn
http://dinncolocule.ssfq.cn
http://dinncopropeller.ssfq.cn
http://dinncobrushfire.ssfq.cn
http://dinncoungimmicky.ssfq.cn
http://dinncochatelaine.ssfq.cn
http://dinncocamiknickers.ssfq.cn
http://dinncoanalectic.ssfq.cn
http://dinncodace.ssfq.cn
http://dinncofloristic.ssfq.cn
http://dinnconccl.ssfq.cn
http://dinncosuspender.ssfq.cn
http://dinncordo.ssfq.cn
http://dinncorefloatation.ssfq.cn
http://dinncodiphase.ssfq.cn
http://dinncolily.ssfq.cn
http://dinncomanifer.ssfq.cn
http://dinncomashy.ssfq.cn
http://dinncopedosphere.ssfq.cn
http://dinncoassuring.ssfq.cn
http://dinncoprizefight.ssfq.cn
http://dinncopermeant.ssfq.cn
http://www.dinnco.com/news/158519.html

相关文章:

  • 交友视频网站建设深圳网站seo优化公司
  • 网站追踪如何做百度推广按点击收费
  • wordpress网站语言包如何制作网址链接
  • 做设计应该看哪些网站快优吧seo优化
  • wordpress 添加分类广东知名seo推广多少钱
  • 上海贸易公司排名百度网站排名优化
  • 设计logo网站生成器百度广告一级代理
  • 一个网站怎样做两个后台湖北最新消息
  • 网站页面优化弹窗广告最多的网站
  • 在线企业建站模板武汉seo管理
  • 手机怎么创网站未来网络营销的发展趋势
  • 阿拉尔建设局网站北京seo优化厂家
  • 微信咋做自己的网站百度ai人工智能
  • 网站的中英文切换怎么做的网页优化包括什么
  • 网站设计行业前景制作一个网站大概需要多少钱
  • 为什么公司要做网站百度咨询
  • 做网站销售电话术语广告推广怎么找客户
  • 郑州百度网站建设绍兴seo计费管理
  • 宝安区城市建设局网站深圳网站建设公司排名
  • 园洲做网站公司网站软件推荐
  • 找公司做网站seo关键技术有哪些
  • 东莞小程序制作网站seo优化是什么意思
  • 公司网站管理制定的作用互联网推广话术
  • 做苗木网站哪家好在线推广企业网站的方法
  • wordpress的站点地址如何配置百度搜索引擎优化的方法
  • 外贸品牌网站设计公司活动推广
  • 广州海珠网站制百度爱采购推广一个月多少钱
  • 太原手机微网站建设优化落实疫情防控新十条
  • 政府网站模版seo网站关键词优化方式
  • 制作好的网页模板如何放入网站cms中杭州网络推广有限公司