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

还有哪些网站可以做淘宝活动济南百度公司

还有哪些网站可以做淘宝活动,济南百度公司,专注昆明网站推广,乔拓云网站建设文章目录 前言 序1#xff1a;什么是内存#xff1f; 序2#xff1a;地址是怎么产生的#xff1f; 一、指针是什么 1、指针变量的创建及其意义#xff1a; 2、指针变量的大小 二、指针的解引用 三、指针类型存在的意义 四、野指针 1、什么是野指针 2、野指针的成因 a、指… 文章目录 前言 序1什么是内存 序2地址是怎么产生的 一、指针是什么 1、指针变量的创建及其意义 2、指针变量的大小 二、指针的解引用  三、指针类型存在的意义 四、野指针 1、什么是野指针 2、野指针的成因 a、指针未初始化 b、指针越界访问 c、指针指向的空间释放 3、如何避免野指针的产生 a、指针要初始化 b、小心指针越界 c、指针指向空间释放及时置NULL d、避免返回局部变量的地址 e、指针在使用前检查有限性 五、指针的运算 1、指针 加、减 整数 2、指针 - 指针  3、指针的关系运算 六、指针和数组 八、二级指针 九、指针数组 总结 前言 全文12000 抽丝剥茧地讲述指针还不赶紧收藏起来 序1什么是内存 在正式开始讲解指针之前我们先来思考一下什么是内存。生活中手机有内存、电脑也有内存……有了以上经验内存似乎就是用来存放数据的一个空间。 内存是电脑上重要的存储器计算机中的CPU中央处理器在处理数据的时候需要的数据是从内存中取得的。内存很大有4GB\8GB\16GB等所以如何高效地使用内存呢计算机把内存划分为一个个小小的内存单元其中每个内存单元的大小为1Byte[注1]由于数量之多想要高效地访问到内存中地每个单元于是乎就给每个内存单元进行了编号而这些编号称为内存单元的地址。 将上述语句平常化地理解就是我们将内存当作一栋楼宿舍楼为了高效地利用这栋楼宿舍楼的空间我们就要将这栋楼宿舍楼划分为一个一个房间大小相同而为了方便寝室的管理和快速找到一寝室于是就给这些房间宿舍进行编号于是宿舍就相当于内存中的一个个内存单元 注1为什么内存单元取 byte而不取 bit 呢因为如果取 比特位这是非常不合理的若我创建一个变量 c : char c ;变量c 变占了1byte 即8bit的空间若是一个内存单元为 1bit那么光是想存放一个char 类型的数据就需要8个内存单元的空间并且每个内存单元都有地址的话十分浪费而char 类型还是在内存空间中占得内存最小得类型而从字节往上走KB、MB、GB等都太大了所以一个内存单元为1 byte 最合适。 序2地址是怎么产生的 那么你可能就会有疑问每个内存单元的编号也就是地址是怎么产生的呢 地址产生的原理依靠电脑硬件的电路产生地址中总线通电便会产生电信号而电信号分为正脉冲和负脉冲即地址线通电便会产生1或者0地址信息会下达给内存在内存中便可以找到该地址对应的数据将数据通过地址总线传入CPU寄存器。 如果是32位电脑就会有32条地址总线通电时就会产生2^32 种二进制序列产生32位二进制序列而每一位有两种可能性是0或者1便可以用这2^32种二进制序列对内存单元进行编号而一个内存单元的大小为 1Byte,那么32位的电脑内存便有2^32byte的大小即4GB【注2】 注2计算机中的单位 Bit (比特位) 一个比特位就是用来存放一个二进制位的0或者1是计算机中的最小单位  Byte字节 1 byte 8 bit KB (千字节Kilobytes) : 1kb 1024 byte MB (兆字节Megabytes) : 1 mb 1024 kb GB (吉字节Gigabyte) : 1 gb 1024 mb TB (太字节terabyte) : 1 tb 1024 gb  如果是64位的电脑就会有64条地址总线通电时就会产生2^64种二进制序列产生64位的二进制系列且每一位有两种可能性是0或者1便可以用这2^64种二进制序列对内存单元进行编号而一个内存单元的大小为 1Byte,那么64位的电脑内存便有2^64byte的大小也就是2^32GB 显然32为电脑上地址为32位的二进制序列64位电脑上地址为64位的二进制序列地址的本质是二进制序列但是为了方便我们观察呈现出来让我们看到的是十六进制的表现形式。 而变量在创建时就会根据其类型向内存申请空间因为每个内存单元都有地址所以变量也是有地址的 注内存单元的地址不需要再存放起来这些地址是由硬件生成的计算机是直接访问此编号对应的内存单元除非你想要将其地址取出来放到一个指针变量中此时才会将地址存放起来 例如 int a 4; 假设竖着的所有方块为内存每一个方块为一个内存单元由于变量a 的类型为Int 类型int 类型在内存中所占的空间为4 byte那么变量a 在创建的时候就会向内存申请4byte 的空间来存放变量a 的值由于此处它初始化了那么这 4byte 的空间中存放的数据便是4 变量a的地址取得是第一个内存单元的地址低地址那一方的第一个内存单元 一、指针是什么 从字面意思来看指:意为指向而针我们难免会想到时针意为准确的意思所以简单地从字面意思我们可以这样理解指针准确指向一个东西那么什么能准确地指向一个东西呢如果想要准确地指向一个人我们会想到说是身份证而如若我们网购时想让包裹准确地送到指向我们家时这时候就会用到地址 概念讲述 1、指针是内存中一个最小单元的编号也就是地址。即内存单元的编号地址指针 2、平时我们口语所说的指针为指针变量指针变量只用来存放地址的一个变量 1、指针变量的创建及其意义 当我们想创建一个变量时 int a 4 -- “创建”就包含了这个变量的类型以及变量名 -- 有了类型才能向内存申请空间来存放变量中的数据 而若我们想把某一数据举例将上面变量 a的地址存放起来的地址存放到一个变量中时同理也需要类型 变量名 存放地址的变量我们称之为指针变量由于变量a 的类型是 int ,如果想要把变量a 地址存放起来以利于解引用时可以绕过a 访问到变量a --- 为了能访问到变量a 存放在内存中的值所以这里指针变量的类型为 int* ; 故而 int* p a ; --  将变量a 的地址取出来放到指针变量 p 中 其中int 说明p指向的对象的类型为 int 类型* 说明 p 时指针变量 p 为指针变量 ; 既然 * 是用来说明此变量为指针变量的所以在连续创建指针时有一个需要注意的点 int * p1, p2 , p3 ; 并不是创建了三个指针变量实际上是 --创建了一个指针加上两个整型变量 int* p1;   int p2 ;   int  p3; 若想要创建三个指针变量应给这样写 int* p1,*p2 ,*p3 ; 2、指针变量的大小 指针变量的大小取决于地址的大小而地址的大小取决于平台地址线的多少 思考还记得前文说地址是如何产生的吗地址依靠电脑硬件的电路产生的地址总线通电后会产生正脉冲和负脉冲即1或者0而电脑的地址线决定了电脑的位数即32位平台下便有32条地址总线64位平台下便有64条地址总线 32位平台 -- 32条地址总线 -- 产生32位脉冲信号 -- 每一位存储的是1或者0 -- 二进制的每一位占1bit --  32 bit 即 4byte  64位平台 -- 64条地址总线 -- 产生64位脉冲信号 -- 每一位存储的是1或者0 -- 二进制的每一位占1 bit -- 64 bit 即 8 byte  所以在32位平台下指针变量所占内存空间的大小为 4byte 在64位平台下指针变量所占的内存空间为 8 byte ;  注指针变量的大小只与平台有关与其类型无关 二、指针的解引用  思考将地址存放到指针变量中有什么意义呢 我们可以通过地址找到对象。但是如何通过地址找到对象呢 -- 对地址进行解引用操作因为地址就是存放在指针变量中的所以对指针变量进行解引用操作也是可以得到该对象 例1 代码如下 #includestdio.hint main() {int a 4;int* p a;*p 6;printf(%d\n, a);return 0; } 代码运行结果如下 分析 int* p a; -- 取出变量a 的地址并存放到指针变量p中 *p 6 -- 利用* 对存放在指针变量中的地址进行解引用操作找到了变量a 并且对a 进行了赋值操作故而 a 为6即输出为6 注1、将地址存放到指针变量中的意义在于有一天我可以通过对指针进行解引用的操作而找到它所指向的对象 2、地址是不能随意被改动的。因为编译器在运行起来的时候地址已然被指派就不能随意更改。 3、任何变量的创建均会在内存中开辟空间 三、指针类型存在的意义 int* p NULL; //当我们创建指针变量时不知到初始化为什么时就可以初始化为NULL 指针变量 p的类型为 Int*  我们先来看一个例子 例2 代码如下 #includestdio.hint main() {char* p1 NULL;short* p2 NULL;int* p3 NULL;long* p4 NULL;printf(%zu\n, sizeof(p1));printf(%zu\n, sizeof(p2));printf(%zu\n, sizeof(p3));printf(%zu\n, sizeof(p4));return 0; } 在x86环境下代码的运行结果如下 分析只要在x86环境下不论指针为什么类型指针变量在内存中所占的空间均为 4Byte; 在x64 环境下的运行结果 分析只要在x64环境下不论指针为什么类型指针变量在内存中所占的空间均为 8Byte;因为指针变量中存放的是地址而地址的大小只与电脑的位数硬件有关。 看了以上例子你可能就会有疑问了指针的类型到底有什么作用在此我们先把指针变量的作用放出来 1、指针类型决定了指针在进行解引用操作的时候会有几个字节的访问空间 2、指针类型决定了指针在进行加法、减法指针加减整数时一次跳过多少个字节。 我们再看一个例子 例3 代码如下 #includestdio.hint main() {int a 0x11223344;char* p (char*)a;*p 0;printf(%x\n, a);return 0; } 代码运行结果如下 注进制仅仅只是数据的表现形式变量a 的数据为十六进制数据:11223344; 变量a的数据在内存中存储的形式是二进制的补码但是为了方便查看表现给我们eg.调试中的监视器上看到的为十六进制的数据而一个十六进制为表示为4个比特位而8比特位为1字节故而两个十六进制为占1字节。 这里变量p的类型为char* 类型char 在内存中所占的空间为 1byte,故而 char* 类型的指针变量在解引用时访问空间的大小为 1byte所以 *p 0 访问的是变量a存放在内存中4字节中的1字节并且将其赋值为0由于硬件的问题在vs编译器上显示为大端字节序知道有这么个东西即可即数据在内存中倒着排放所以*p 0; 将变量a在内存中的44赋值为0故而输出为11223300 注占位符 %x 专门用来对应十六进制的数据 此处调试-- 内存 -- a  也可以发现数据在内存中是倒着存放的 那么当指针变量 p 的类型为 Int* 时*p 0 ;会不会将变量a的存放在内存中4个字节的数据都更改为0呢 例4 代码如下 #includestdio.hint main() {int a 0x11223344;int * p a;*p 0;printf(%x\n, a);return 0; } 代码运行结果如下 分析将变量a存放数据的地址存放到指针变量p 中因为指针变量p的类型为int* 所以对p进行解引用操作就会访问4byte的空间而 *p 0; 也是将这四个字节的空间更改为0 显然便可以证实指针变量的类型决定了当解引用该指针变量时会访问内存空间多少字节。 那么指针变量加、减一个整数时它表达的意思是什么呢 例5 代码如下 #includestdio.hint main() {int a 0x11223344;int* p1 a;char* p2 a;printf(p1%p\n, p1);printf(p2%p\n, p2);return 0; } 代码运行结果如下 从以上例子中我们可知即使指针变量的类型不同但存放的都是变量a的地址 我们再看一个例子 例6 代码如下 #includestdio.hint main() {int a 0x11223344;int* p1 a;char* p2 a;printf(p1%p\n, p1 );printf(p2%p\n, p2 );printf(p11%p\n, p11);printf(p21%p\n, p21);return 0; } 代码运行结果如下 分析指针变量p1 的类型为 int*,即指针变量 p1访问的内存空间的大小为 4byte,所以当 p11 时指的是跳过此指针变量的大小即 4byte而指针变量 p2 的类型为 char* ,即指针变量p2 访问内存空间的大小为 1byte所以当 p21 时指的是跳过此指针变量的大小即 1byte 可以参考以下图解 分析变量a 由于是 int 类型在内存空间中所占4 byte指针p1、p2 中存放了变量a第一个字节对的地址由于p1和p2的类型不同所以它们的访问权限不同它们的访问权限由其类型决定的。故而 p11 与 p21 指向的地址不同(p11)的地址 在 p1 原地址的基础上增加了4 byte而p21的地址在p2 的地址的基础上增加了1 byte 注内存被划分为一个个内存单元每个内存单元都有编号即地址每个内存单元的大小为1 Byte 看到这里你可能又有疑问了float 类型和 int 类型都在内存中占4 byte那么可以将 float 与 int 混用吗 我们先看一下一下代码 例7-1 代码如下(当指针变量的类型为 float* 时) #includestdio.hint main() {int a 4;float* pf a;*pf 100.0f;return 0; } 调试 -- 内存 -- a 例7-2 代码如下当指针变量类型为 int* 时 #includestdio.hint main() {int a 4;int* pi a;*pi 100.0f;return 0; } 代码运行结果如下 分析整型与浮点数在内存中的存储是有差异的故而在内存中体现不同 int* 与 float* 不能通用一是因为int* 与float* 对内存的解读方式有所差异二是因为站在指针变量角度来看存放在指针变量 pf中的地址指向的是浮点型数据而存放在指针变量 pi中的地址指向的是整型数据  综上指针变量的类型是有意义的它决定了指针在进行解引用时会有多少字节的访问空间也决定了指针在进行加、减整数时一次跳过多少个字节。同时即使在内存中占同样大小的类型也不能通用 四、野指针 1、什么是野指针 顾名思义野的指针就是野指针 概念:野指针就是指针指向的位置是不可知的随机的、不正确的、没有明确限制的 2、野指针的成因 a、指针未初始化 指针没有初始化就代表着没有明确地指向若是一个局部变量不初始化那么其中放的就是随机值-- 指针没有初始化那么在指针放的也是随机的地址但是这个随机的地址不属于这个指针故而没有使用该地址的权限 b、指针越界访问 看一下此代码 例8 代码如下 #includestdio.hint main() {int arr[10] { 0 };int i 0;int* p arr;for (i 0; i 12; i){*(p ) 1;printf(haha\n);}return 0; } 分析此代码中数组arr只有10个元素可是循环有12次而在循环体中就会访问到数组以外的空间当指针指向数组arr以外的空间时此指针变量p就是野指针;  c、指针指向的空间释放 例9 代码如下 int* test() {int a 10;return a; }int main() {int* p test();*p 4; //此时 p 已为野指针return 0; } 分析类型为int* 的指针变量 p 接收了 test() 函数的返回值然而变量a 是局部变量作用于test() 函数内部而局部变量进入其作用域才会创建出了其作用域便会销毁销毁即为将这个局部变量创建时向内存申请的空间还给操作系统故而出了函数的作用域变量a 的当初占用的内存空间已经不属于a的了但是在main函数中指针变量p中依然存放着局部变量a当初的地址然而指针变量p还是有能力找到此地址对应的空间然而p找到这块空间并不能去访问并使用(此空间已经不属于该程序的了) 此时的p为野指针; 3、如何避免野指针的产生 a、指针要初始化 注当不知道初始化什么时可以初始化为NULL(空指针);NULL本质上就是0但是空指也不能直接使用初始化为空指针也仅仅只是保证了该指针变量不为野指针; 空指针不能直接使用在使用之前需进行判断 利用语句对该指针变量进行判断确保它有了指向之后我才使用它 但是用这个判断并不能用来避免野指针 例10 代码如下 #includestdio.hint* test() {int a 4;return a; } int main() {int* p test();if (*p ! NULL){printf(%d\n, *p);}return 0; } 代码运行结果如下 思考指针p指向的空间已然释放可是为什么还可以打印出p中地址存放的数据呢 首先if ( *p ! NULL ) 仅仅只是想确认存放在指针p 中的地址是否有指向并不能判断这个指针是不是野指针其次是出了作用域局部变量a 便会被销毁销毁即是将这个局部变量在创建时向内存申请的内存空间还给操作系统但是这块空间仍然存在只是不属于该程序了此时变量a 与此空间就没有关系了但是在main函数中将这块空间的地址存放在了指针p中指针p仍然可以顺着此地址找到对应的空间此空间中还存放着之前存放的数据 4此前提为此空间未被其他数据覆盖所以不代表此空空间一直存放着这一个数据. 关于数据覆盖可以看一下一下例子 例11-1 代码如下 #includestdio.hint* test() {int a 4;return a; } int main() {int* p test();printf(haha\n);if (*p ! NULL){printf(%d\n, *p);}return 0; } 代码运行结果如下 例11-2 代码如下 #includestdio.hint* test() {int a 4;return a; } int main() {int* p test();printf(haha\n);printf(hehehehe\n);if (*p ! NULL){printf(%d\n, *p);}return 0; } 代码运行结果如下 分析函数栈帧当调用test() 时此栈帧中有变量a 当函数调用结束之后其函数栈帧的空间就空出来了紧接着后面调用 printf() 函数printf() 函数也会建立自己的函数栈帧它把上一次test() 函数栈帧所占的空间给覆盖了第一次是字符串 haha printf() 的返回值是成功打印数据分个数在字符串后面还有一个 \0,\n’, 但是printf() 不会打印 \0 ,显然printf(haha\n);成功打印了5个元素故而printf() 返回值为5同理。第二个 printf() 成功打印了9个元素故其返回值为9 b、小心指针越界 c、指针指向空间释放及时置NULL d、避免返回局部变量的地址 e、指针在使用前检查有限性 五、指针的运算 1、指针 加、减 整数 例12利用地址来为数组元素赋值 代码如下 #includestdio.hint main() {int arr[10] { 0 };int* p arr;int i 0;for (i - 0; i 10; i){*p 2;p;}return 0; } 代码调试结果如下 分析数组名为首元素地址int* p arr ;即将此数组首元素的地址存放到指针 p之中*p 2; 对指针 p 进行解引用操作根据存放在p 中的地址找到这个地址的对象并将此对象赋值为2p; 即让指针 p自增数组元素的类型为Int 类型而指针 p的类型为Int*, 所以p1 就能跳过4byte 的内存空间即跳过了一个整型的大小也就是说跳过了数组中的一个元素而指向了下一个元素的地址 2、指针 - 指针  前提这两个指针必须是指向同一空间才有意义 规则|指针 - 指针| 两指针间元素的个数 思考我们从例12,或许可以感悟到存放有首元素地址的指针变量1  (因为数组元素的类型为int 类型而指针的类型为 int*)  便会跳过一个元素从而指向下一个元素的地址指针变量中存放的是地址同理地址1也可以实现跳过一个元素,以例12 中的数组为例由于数组元素的类型为int 类型故而各个数组元素的地址均为 Int* 类型。那么首元素地址3便会跳过三个元素指向数组中第四个元素的地址那么第四个元素的地址- 首元素地址 3这个3是什么意思呢数组中第四个元素即为下标为3 的元素而首元素就是下标为0 的元素指向下标为0 的元素的地址是此元素中4byte 中的第一个字节的地址指向下标为4 的元素的地址也是此元素中 4byte 中的第一个字节的地址 所以 3 就代表着下标为4 的元素不包含下标为4 的元素到下标为0 的元素包含下标为0 的元素即两指针间元素的个数 例13 代码如下 #includestdio.hint main() {int arr[10] { 0 };printf(%d\n, arr[5] - arr[0]);return 0; } 代码运行结果如下 利用指针- 指针结果的绝对值代表着两指针间元素的个数我们可以利用指针 - 指针模拟实现 strlen () 函数 例14 代码如下 #includestdio.hint my_strlen(char* str) {char* start str;//将元素的地址存放起来//在 \0之前的元素均为要算上个数的元素while (*str ! \0)str;return (str - start); //随着数组元素下标的增长元素的地址也变高 //数组的存放是从低地址到高地址 }int main() {char ch[] abcdef;int ret my_strlen(ch);//字符串传参的时候并不是传的其本身 //而是字符串中首元素的地址printf(%d\n, ret);return 0; } 代码运行结果如下 3、指针的关系运算 思考指针本质也是二进制的数组以代表着内存单元的编号只不过给我们呈现的是十六进制的形式进制仅仅只是数据的一种表现形式既然地址也是数据那是不是代表着地址之间也可以进行比较大小 在例12中我们利用数组元素的地址来进行赋值操作同理我们在控制循环时其初始化、判断、调整都可以利用元素地址的形式; 例15 代码如下 #includestdio.hint main() {int arr[10] { 1,2,3,4,5,6,6,7,8,9 };int* i 0;int sz sizeof(arr) / sizeof(arr[0]);for (i arr; i arr sz ; i){printf(%d , *i);}return 0; } 代码运行结果如下 例15中指针 i ; i  arr sz  ; 便用到了指针之间的关系运算还可以写为 i  arr [ sz ]; 显然arr[ sz ]是数组 arr 范围之外的元素在实际使用中也并未使用到该元素故而不存在越界访问的问题想要利用地址来访问元素循环中如果会以数组外的地址作为判断的指标就只能从低地址写向高地址因为标准规定允许指向数组元素的指针与指针数组的最后一个指针数组最后的那个内存位置的指针进行比较但是不允许与指向第一个元素之前那个内存位置的指针进行比较 如上图所示在数组 arr范围以外的地址在进行指针关系运算时只能用p2 指针而不能用p1指针 六、指针和数组 数组一组相同类型元素的集合-- 在内存中体现为连续开辟的一块空间 指针地址 指针变量一个存放地址的变量 数组名就是首元素地址我们可以通过其地址来访问数组中的元素以上举过有关利用指针访问数组元素的例子这里就不过多赘述了 注数组是数组指针是指针需二者要加以区别 八、二级指针 概念二级指针变量是用来存放一级指针的地址的 int a 4; int* pa a; int** ppa pa; pa 是一个一级指针变量既然为变量那么也是需要向内存申请空间来存放其数据所以pa 也有地址将pa 的地址存放 在变量 ppa 之中即指针变量 ppa为二级指针变量 int* pa a ;-- int 代表存放在pa中地址的对象是int 类型 * 代表了变量pa 为指针变量 同理int** ppa pa ; --  int* 代表了存放在ppa 中的对象是int* 类型后面的* 代表了变量 ppa 为指针变量  调试结果如下 九、指针数组 指针数组顾名思义就是存放指针的数组主语为数组而指针作为一个修饰词 例16降数据的地址存放到数组中然后再在数组中访问到该对象 代码如下 #includestdio.h int main() {int a 10;int b 20;int c 30;int* arr[] { a,b,c };int sz sizeof(arr) / sizeof(arr[0]);int i 0;for (i 0; i sz; i){printf(%d , *(arr[i]));}return 0; } 代码运行结果如下 看了以上代码如果数组里面放的是数组的地址呢在学习数组的时候我们知道二维数组可以看作是一个一维数组只不过在这个一维数组中的元素也是一个数组基于此我们可以利用指针数组来模拟二维数组 例17-1利用指针数组来模拟二维数组 代码如下 #includestdio.h int main() {int arr1[4] { 1,1,1,1 };int arr2[4] { 2,2,2,2 };int arr3[4] { 3,3,3,3 };int* parr[] { arr1,arr2,arr3 };int i 0;int j 0;for (i 0; i 3; i){for (j 0; j 4; j){printf(%d , *(*(parr i) j)); //将数组名当作地址}//打印完一行就换行printf(\n);}return 0; }例子17-2 #includestdio.h int main() {int arr1[4] { 1,1,1,1 };int arr2[4] { 2,2,2,2 };int arr3[4] { 3,3,3,3 };int* parr[] { arr1,arr2,arr3 };int i 0;int j 0;for (i 0; i 3; i){for (j 0; j 4; j){printf(%d ,parr[i][j]); //利用数组下标进行访问}//打印完一行就换行printf(\n);}return 0; } 两个例子的代码运行结果如下 分析数组 parr中元素的类型为 int* 故数组parr的类型为 int* ; 数组即可从下标的视角来访问数组中的元素若将数组名当作首元素的地址也可以从访问地址的视角来访问数组中的元素所以有两种方法来访问数组中的元素 一是利用数组名为首元素地址的特点*(*(parr i) j) --  parr 为parr 数组的首元素 arr1 的地址而arr1 代表着arr1 中首元素的地址对parr i解引用便可以找到数组parr 中的元素而数组parr 中的元素又为数组的首元素地址*(parr i) j 意为访问parr中的数组中的元素的地址所以*(*(parr i) j) 便就访问到了数组 parr中存放的数组的元素 二是利用数组的下标进行访问parr[ i ] 就是数组parr中的元素因数组parr中的元素也是数组例 parr[ 1 ] arr ; 就可以将 parr [ i ] 也看作数组名那么arr[ j ] 就可以写为 parr [ i ][ j ] ; 总结 1、内存是电脑上重要的存储器计算机中的CPU中央处理器在处理数据的时候需要的数据是从内存中取得的。 2、每个内存单元的编号也就是地址是依靠电脑硬件的电路产生内存单元的地址不需要再存放起来计算机是直接访问此编号对应的内存单元 3、指针是内存中一个最小单元的编号。即内存单元的编号地址指针平时我们口语所说的指针为指针变量指针变量只用来一个用来存放地址的变量 4、若想要创建三个指针变量应给这样写 int* p1,*p2 ,*p3 ; 5、指针变量的大小取决于地址的大小而地址的大小取决于平台地址线的多少指针变量的大小只与平台有关与其类型无关32位平台-- 4byte ; 64位平台 -- 8byte; 6、地址是不能随意被改动的。因为编译器在运行起来的时候地址已然被指派就不能随意更改。任何变量的创建均会在内存中开辟空间 7、指针类型决定了指针在进行解引用操作的时候会有几个字节的访问空间指针类型决定了指针在进行加法、减法指针加减整数时一次跳过多少个字节。 8、野指针就是指针指向的位置是不可知的随机的、不正确的、没有明确限制的 9、野指针的成因a、指针未初始化b、指针越界访问 c、指针指向的空间释放  10、避免野指针的产生a、指针要初始化 b、小心指针越界  ; c 、指针指向的空间释放时要及时置为NULL d、避免返回局部变量的地址 e 、指针在使用前检其有限性 11、指针 - 指针 前提这两个指针必须是指向同一空间才有意义 规则|指针 - 指针| 两指针间元素的个数 12、二级指针变量是用来存放一级指针的地址的 13、指针数组顾名思义就是存放指针的数组主语为数组而指针作为一个修饰词
http://www.dnsts.com.cn/news/161275.html

相关文章:

  • 2017网站建设前景网站商城具有哪些功能模块
  • 加拿大28怎么做网站代理要搭建网站
  • 户外网站 整站下载有个新网站能提供
  • 网站建设 中企动力 石家庄网站从建设到上线流程图
  • 做社区生意的网站网站上二维码怎么做的
  • 重庆seo整站优化效果内涵吧网站
  • 新手如何注册网站域名深圳市网站建设制作设计品牌
  • 浙江建设厅网站 打不开做单位网站的公司吗
  • php 免费网站空间申请中信建设有限责任公司股票代码
  • 企业网站系统设计与实现成都做网站设计哪家最权威
  • dw制作简单网站模板下载地址mysql 网站开发 问好
  • 动易网站模版的制作手机版网站版面设计怎么做
  • 网站管理系统有哪些统计助手小程序怎么制作
  • 分析电子商务网站建设需求教案Wordpress 点击量 插件
  • 东莞网站优化科技有限公司免费开发游戏的软件
  • 网页设计 参考网站开发公司移交物业清单
  • 网站导航栏动效怎么做专门做win7系统的网站
  • 做商城网站费用要怎么做网络营销
  • 网络设备主要用于网站局域网建设创建网页快捷方式
  • 怎么把网站设置为主页面wordpress音频防盗链
  • 天津微信网站开发陈木胜妻子
  • 提出网站推广途径在哪查网站备案
  • 网站备案怎么注销网站色彩代码
  • 企业网站 优帮云百度指数搜索榜度指数
  • 沈阳城市建设招生网站开发者 电影
  • 邯郸营销型网站网站设计 版权
  • 电商网站设计方法保定seo排名
  • 做网站论文百度搜索引擎优化方案
  • 做视频网站犯法么莱特币做空 网站
  • 昆明网站建设服务公司做网站存在的问题