C指针乱记

//int a[3][4] = { { 66, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
//读取二维数组任意元素hint int(*)a[4] i,j
//函数对于数组没有副本,数组多了会非常浪费cpu和内存
//对于一维数组,作为参数可以使用指向变量的指针
//对于二维数组可以用数组指针int(*)[4]
//由于没有副本,函数对参数的操作实际上就是对数组本身的修改
//逆序,冒泡算法中指针的应用(算法分析可参照数组一个章节)
//输出学生成绩,每个学生有4门课成绩,求平均成绩, 提取不及格
//=====================函数指针=====================
//定义函数后。编译系统编译时会为函数划定一片内存空间,这片内存空间的首地址即为函数的起始边界,也就是函数指针,函数名实际上就是个内存地址,printf(函数名),利用vs2013的反汇编功能,汇编中的jmp即是C语言的goto ,参考游戏中,捡宝箱,goto,给服务器发请求,捡到犀牛反坦克战车 void(*p)() = msg msg是另一个定义好的函数,这是函数的间接调用p();这一用法常用于做挂;MessageBoxA的用途
//指针的直接调用和间接调用 声明函数指针后只能赋值函数名(只能传递至)函数指针不能做++ -- 因为没有任何意义
//综合实例,根据用户输入分别执行函数,函数指针必须明确 返回值 参数的数据类型 指针类型必须一致,盟军的转移大法,使用了move函数,该特性还可用于hijack
//=======================返回指针的函数============================
//定义 int *go(){return &b},调用*(go())
//用随机数生成一个数组,并返回最小值的指针,并根据指针修改最小数的值,这一基础技术将在字符串中大方异彩
//char str[40];printf("%s",strcpy(str,"喜欢陈培昌")); -----实现一个自定义的strcpy函数,利用指针原理实现程序窗口控制
//左值int a =5,a即为左值,变量指针也可以为左值;指针常量除外 int *const = px
int a=30,b=6;
printf("a的地址%p,b的地址%p\n",&a,&b);
int *p;
scanf("%x", &p);//输入一个16进制整数,这里把a,b的地址;%x输入后六位,%p输入所有位数
*p = 888;
printf("%d\n",b);
system("pause");
//空指针 可以接收任何类型的指针,用于malloc返回指针的场景,void指针实际作用是快递指针
//注意调用void指针时,要转换成你需要的指针类型
//memset()对内存的每一个字节赋值#include<memory.h> memset(str,‘A‘,5)// num(5)={2,3,4,5}memset(num,0,20)数组清0
//malloc(1024*1024*8)8M内存分配;void(*)p=malloc(1024*1024*20),直接给内存地址赋值
//malloc() return void* in stdlib.h free(p)根据地址释放内存 ;检测内存是否分配成功,是否为空
//malloc精髓,对于一个庞大的文件,可以分配合理的内存空间安放文件的一部分
//编译器把代码翻译成机器指令,静态分配处理不了大数据,容易浪费内存,动态:程序运行时可以随时申请,释放内存
//include<limits.h> void *p = malloc(UNIX_MAX)
//realloc重新分配内存,具备复制原数组到重新分配的内存空间的功效realloc(p,newsize)realloc(已分配内存地址,新分配内存地址),calloc(对象个数,对象所占字节数)尝试定义一个数组,并realloc
//malloc,realloc都是分配内存,但是只有realloc会对分配的内存做初始化
//warning:内存释放后,指针的内容并不发生改变,这时引用指针,会得到垃圾数据,程序也会发生异常,所以软件工程规范,指针应该赋值为空!!!内存不能反复释放,也不要释放一个并未占用的地址,指针赋值为NULL,可以规避反复释放内存,以及指针重复引用的问题
//内存泄露:现在已知释放了动态内存,并不意味着指针会消亡,指针的值会发生改变。所以,如果出现内存未释放,而指向这片内存的指针发生了改变,或消亡就会发生内存泄露的事件,持续的泄露将导致系统的崩溃,模拟一场内存泄露事故。服务器等需要持续运行的程序,尤以此害为甚
//迷途指针,内存清空后,指针仍指向原来那片内存区域,访问时,将打印垃圾数据,解决办法,指针赋值为NULL
//getchar()会被当成一个字符
//32位最大识别4G内存,我有2的32次方字节,每个地址表示一个字节,1024=2的10次方 2的32次方能处理的最大位数就是4GB
//指针存储的值是一个32位的地址,所以一个指针大小是4个字节
//vs2013可以通过配置管理器选择64位,以供编写64位操作系统,64位意味着寻址能力更强(如果配置ARM,可能需要外接设备,且只能使用远程调试器)
//64位模拟32:现在海量数据发展,需要更大内存空间对数据进行处理,虽然内存有4G,但cpu寄存器,显卡现存等硬件也占用内存,所谓32位和64位是地址的位数。做服务器编程一定要用64位。int,double等在64位下占用内存或许更大,这由编译器决定!编程的内存概念和硬件的内存卡是有区别的。2的64次方,使得编译器可以管理海量内存,而且还要很高很快的内存处理能力。
//vs DEBUG模式:带有调试信息,文件很大,只为代码跑起来正确
//vs RELEASE模式:优化版本,比较slim,优化代码,运行速度更快
//程序bug 80%集中在内存,C语言和内存交互需要使用系统特权指令
_asm{

}
//调试代码可能会查看寄存器,和内存信息;CPU分两块 运算器和控制器(把值赋给地址)70%--C,15%---汇编, 15%---C++,指令和数据载入内存,由CPU负责运算
//内存按顺序编号组织起来的空间,以供数据载入,内存数据靠供电完成;内存保存的是二进制数据,CPU执行离不开内存,代码区和数据区,
//内存代码区----程序执行指令
//内存数据去----全局和静态数据
//堆栈----存放临时变量
、、
//内存由一系列小个子组成,每个小格子相差1,每个小格子存储8个二进制位(也就是一个字节)
//变量实际上是对内存地址的抽象
//指针变量---专门存储指针地址的变量,一个变量,存储的是值是指针
//指针----指向内存的地址,但这种说法并不完全,指针是内存的量,不仅仅是地址,还有数据类型
//指针变量初始化的必要性,系统不会清空原来地址上的二进制数据,一旦访问,就有可能造成程序崩溃,所以指针使用前务必初始化。当然vs2013等开发IDE新增了安全检查,但vim 等工具并无相关安全机制
//windows下提示的停止工作往往表明你的指针越界了!企图修改操作系统进程的内存变量
//跨进程修改变量时会用到指针(外挂),函数改变外部变量
//gcc vc 数组都无副本机制
//循环数组时,最好使用指针循环,下标循环可能会导致越界;
//函数return机制 auto变量,函数执行完毕后就消亡了
int get()
{
int a=3;
return a;//这厢将返回到寄存器,而寄存器无法取地址和赋值,如果取了就宕机,有副本机制
}
//函数执行完后,内存会被回收,如果恰好没人使用内存,这片内存仍旧保留原来的内容,如果有人使用过,那么里面必是乱码(代码测试)
//返回地址,一定不能返回栈区地址,static int a=3
//char *p="love cpc love xxd";p存储了字符串的首地址 是常量不可修改char *px =p while(*px!=‘\0‘)
//任意数据类型都可以拆分为基本数据类型,返回的副本放入寄存器,或者是cache(内存和CPU之间的),如果cache不够用了,会开辟一段内存,变成虚拟cache(也禁止取地址),例如结构体可以拆分为基本变量放入cache
//使用指针时,注意数据类型 int*p printf("%d\n",*p) 类型---步长---解析方式
//结构体声明数组的两种方式(*p->name)
*========================================结构体======================================
为了存放多种类型的数据结构而发明的数据结构

原文地址:https://www.cnblogs.com/saintdingspage/p/11966297.html

时间: 2024-11-08 14:52:57

C指针乱记的相关文章

第20周日乱记

刚找了物业师傅修好了其中一个床头灯,另外一个因为我之前不小心把线弄断了,导致暂时无法修好,不禁再次感慨,一些事情还是要找专业的人员来做才好,自己要敢于面对在某些方面确实不如别人的自我,不要把私下宝贵的时间和精力花在证明自己某方面不如专业人员身上,而是用在自己擅长.专业.兴趣方面上,让自己更专业. 2014第20周很快又过去了,感觉接下来事情会很多(貌似一直都有这个感觉),负责的项目后期要经常总结回顾待办事宜和接下来要做的事,还有本季度的经验案例,忙碌了一个季度仔细想想没有多少经验案例可总结,技术

【全站工程师练习笔记】第一篇 乱记

曾独立完成公司的全站式工程,使用服务器apache2 + php . 爬虫python + scrapy .web前端 html5 css3 js .安卓端使用框架ionic  iOS端使用原生objective c. 数据库mysql. 现在和哥们几个做一个独立项目,因为是第二次做全站式程序员,这一次准备做一些工作笔记. 这一篇的起源来自于使用框架 thinkphp 时 发现我设置的控制器和方法 并不能如上一个项目一样找到.网上查了一下,据说是apache服务器要配置 rewrite 这个东西

Python初学者乱记

·定义漂亮的python字节码 #/usr/bin/env python #_*_ coding: utf-8 _*_ ·三个内置参数: type,help,dir type:可以查看出变量是属于哪种类型 help:指出参数的使用及方法详细解释 dir:列举出 参数的使用,未涉及详细解释 ·import:定义使用某某块 ·单 "= "号 便是赋值 , 双 "=="号表示 比较 ·Python 对大小写 很敏感 ·常用基本数据类型: int:整型          

AngularJS 乱记

1. 前端简单逻辑 <title data-ng-bind="{true:' ('+notice_count+') '}[notice_count > 0]+{true:global.title,false:'正在加载中'}[global.loading_done]+' - xxxx'"></title>

有个名字叫随便乱记

<img src="image.jpg" data-src-600px="image-600px.jpg" data-src-800px="image-800px.jpg" /> 对应的CSS代码: @media (min-device-width:600px){ img[data-src-600px]{ content: attr(data-src-600px,url); } } @media (min-device-width:8

乱记结论之OI常用四大数列

一.斐波那契数列 $f(0)=1,f(1)=1,f(i)=f(i-1)+f(i-2) \ \ \ \(i>=2)$ 经典的解释是兔子生小孩,第0年一对兔子,一对兔子需要一年长大,后面每年都生小孩,每次刚好生一对,问第i年有多少只.就这么算. 经典的应用是矩阵乘法!稍微写一下: \begin{vmatrix}1 & 1 \\ 1 & 0\end{vmatrix} * \begin{vmatrix}f(i) \\ f(i-1)\end{vmatrix} = \begin{vmatrix}

单词乱记 20180607

人懐っこい「ひとなつっこい」子犬は人懐っこく寄ってくる (幼儿)容易和人亲近,不认生,和蔼可亲 そそっかしい 举止慌张,粗心大意,冒失,轻率,马虎,马大哈 糸瓜「へちま」丝瓜:丝瓜瓤 無花果「いちじく」 枸杞「くこ」 急かす「せかす」催,催促.促使赶快做某事 突っ張る「つっぱる」 最後まで突っ張る 坚持己见.坚持主张 筋が突っ張る (肌肉)发胀.抽筋 貫く「つらぬく」 山を貫く工事だ 初志を貫く 贯通,穿透,穿过 物議を醸す 「ぶつぎをかもす」招致社会议论 ハーモニカ 口琴 アコーディオン 手风

c++/java/c# 几种编程语言的指针、引用比较

前一段时间,我在 cnblogs 别人的博客中,谈到: java 中的引用/指针,与 c++/C# 中的引用/指针不是一个概念. Java 引用,相当于 c++ 指针(fun3).Java 引用可以赋值 null, 而 c++ 引用 (见 fun2) 不能赋值 null,c++ 指针可以赋值 null(fun3). Java 中,无 c++ 引用(fun2)对应的语法. 结果引起不必要的质疑,特此,写博客,对c++/java/c# 几种编程语言的指针.引用,进行比较,期望引起更多的人,对此有所关

类 this指针 const成员函数

C++ Primer 第07章 类 7.1.2 ?Sales_data类的定义如下: #ifndef SALES_DATA_H #define SALES_DATA_H #include <string> #include <iostream> class Sales_data { public: std::string isbn() const {return bookNo;} Sales_data& combine(const Sales_data&); dou