指针强化

铁律1:指针是一种数据类型

1)指针也是一种变量,占有内存空间,用来保存内存地址

测试指针变量占有内存空间大小

int a = 10;char *p1 = 100;  //分配4个字节的内存char ****p2 = 100;int *p3 = NULL;p3 = &a;*p3 = 20; //间接的修改a的值////*就像一把钥匙 通过一个地址(&a),去修改a变量的标示的内存空间
  

 

2)*p操作内存

在指针声明时,*号表示所声明的变量为指针

在指针使用时,*号表示 操作 指针所指向的内存空间中的值

         *p相当于通过地址(p变量的值)找到一块内存;然后操作内存

         *p放在等号的左边赋值(给内存赋值) 

         *p放在等号的右边取值(从内存获取值)

    {int c;int *p3 = 20;c = *p3;//读内存printf("c:%d \n", c);}
View Code

3)指针变量和它指向的内存块是两个不同的概念

//含义1 给p赋值p=0x1111; 只会改变指针变量值,不会改变所指的内容;p = p +1; //p++

    {
     不断地给指针赋值,相当于不停地改变指针的指向
char *p4 = NULL;p4 = (char *)malloc(100);p4 = (char *)malloc(200); //0xcc11 }

                  

//含义2 给*p赋值*p='a'; 不会改变指针变量的值,只会改变所指的内存块的值  

  • 如果我们要修改指针所指向的内存空间数据的时候,我们要保证这个可以修改才行。
#define  _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>void *getStr()
{char *p1 = NULL;p1 = "abcdefg";return p1;
}void main()
{char *p;p = getStr();//printf("%s \n ", p);*(p + 2) = 'j'; // 常量区的不能修稿printf("%s \n", p);
}

//含义3 =左边*p 表示 给内存赋值, =右边*p 表示取值 含义不同切结!

//含义4 =左边char *p 

//含义5 保证所指的内存块能修改

 

4)指针是一种数据类型,是指它指向的内存空间的数据类型 

含义1:指针步长(p++),根据所致内存空间的数据类型来确定

p++=è(unsigned char )p+sizeof(a);

结论:指针的步长,根据所指内存空间类型来定。

        

注意:     建立指针指向谁,就把把谁的地址赋值给指针。图和代码和二为一。        

                   不断的给指针变量赋值,就是不断的改变指针变量(和所指向内存空间没有任何关系)。

 

 

/*指针做函数参数的问题:
指针是一种数据类型,是指它指向的内存空间的数据类型 
int getABC1(char *p1); int getABC1(char* p1); int getABC2(char ** p2); int getABC2(char * *p2); int getABC2(char **p2); int getABC3(char ***p3); int getABC4(char (*p4)[30]); int getABC4(char (*p4) [30]); int getABC5(char p5[10][30]); int getABC5(char p5[10][30]);//指针做函数参数 形参有多级指针的时候, //站在编译器的角度 ,只需要分配4个字节的内存(32bit平台) //当我们使用内存的时候,我们才关心指针所指向的内存 是一维的还是二维的
*/

 练习题:

 

训练1划出内存四区

void main26()

{

       char buf[100];

       //byte b1 = new byte[100];

       int a = 10; //分配4个字节的内存 栈区也叫临时区

       int *p;//分配4个字节的内存

       p = &a; //cpu执行的代码,放在代码区

 

       *p = 20; //

 

       {

              char *p = NULL; //分配4个字节的内存 栈区也叫临时区

              p = (char *)malloc(100); //内存泄露概念

              if (p != NULL)

              {

                     free(p);

              }

       }

      

       system("pause");

}

 

 

 

全局区代码测试

char * getstring1()

{

       char *p1 = "abcde";

       return p1;

}

 

char * getstring2()

{

       char *p2 = "abcde";

       return p2;

}

 

 

void main()

{

       int i= 0;

 

       //指针指向谁就把谁的地址赋给指针变量。

       char *p1 = getstring1();

       char *p2 = getstring2();

       char *******    p3 = NULL; //p3 是个变量

 

       //指针变量和它所执行的内存空间变量是两个不同的概念

       strcmp(p1, p2);

 

       system("pause");

}

 

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>void main()
{char buf[100];//byte b1 = new byte[100];int a = 10; //分配4个字节的内存 栈区也叫临时区int *p;//分配4个字节的内存p = &a; //cpu执行的代码,放在代码区*p = 20; //
    printf("&a:%d \n", a);   //20printf("*p:%d \n", *p);  //20
    {char *p = NULL; //分配4个字节的内存 栈区也叫临时区p = (char *)malloc(100); //内存泄露概念if (p != NULL){free(p);}}system("pause");
}
View Code

 

 

 

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//全局区代码测试
char * getstring1()
{char *p1 = "abcde";return p1;
}char * getstring2()
{char *p2 = "abcde"; //编译器自动认为这两块内存块一样return p2;
}
void main()
{int i = 0;//指针指向谁就把谁的地址赋给指针变量。char *p1 = getstring1();char *p2 = getstring2();char *******    p3 = NULL; //p3 是个变量//*p1和*p2输出相同地址printf("%d\n", p1);printf("%d\n", p2);//指针变量和它所执行的内存空间变量是两个不同的概念
    strcmp(p1, p2);system("pause");
}
View Code

 

训练2 划出内存四区

void main01()

{

       char buf[100];

       //byte b1 = new byte[100];

       int a = 10; //分配4个字节的内存 栈区也叫临时区

       int *p;//分配4个字节的内存

       p = &a; //cpu执行的代码,放在代码区

 

       *p = 20; //

 

       {

              char *p2 = NULL; //分配4个字节的内存 栈区也叫临时区

              p2 = (char *)malloc(100); //内存泄露概念

              if (p2 != NULL)

              {

                     free(p2);

                     //p2 = NULL;  若不写,实验效果,分析原

 

 

              }

              if (p2 != NULL)

              {

                     free(p2);

              }

       }

 

       system("pause");

}

 

不加时候:

 

 

解决办法:

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>//野指针产生的原因
//指针变量和它所指向的内存空间变量是两个不同的概念
// 释放了指针所致的内存空间  但是指针变量本身没有重置成null
//造成释放的时候 通过if (p1 != NULL)//避免方法: 1)定义指针的时候 初始化成nuLL 2)释放指针所指向的内存空间后,把指针重置成NULL。
void main11()
{char  *p1 = NULL;p1 = (char *)malloc(100);if (p1 == NULL){return ;}strcpy(p1, "11112222");printf("p1:%s \n", p1);if (p1 != NULL){free(p1);p1 = NULL;}//
if (p1 != NULL){free(p1);}printf("hello...\n");system("pause");return ;
}

 

 

 

 

 

指针的特殊 和共享内存块

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>void main()
{//指针第一个位置不能用char *p1 = NULL;strcpy(p1, "abcdefg");printf("hello...\n");system("pause");return ;
}void main02()
{//看提示的值char *p1 = NULL;p1 = 0x00077;strcpy(p1, "abcdefg");printf("hello...\n");system("pause");return ;
}

 

画内存四区图 指针的精华(很像函数调用)

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>void main()
{char buff[128];int i;int j = 0;char *p2 = NULL;char *p1 = NULL;p1 = &buff[0];p1 = &buff[1];p1 = &buff[2];for ( i = 0; i < 10; i++){p1 = buff[i];}p2 = (char *)malloc(100);strcpy(p2, "abcdrfg2e42989");for ( i = 0; i < 10; i++){p1 = p2 + i;printf("%c ", *p1);printf("%c ", *p2);//p2 始终指向第一个元素
    }system("pause");return;
}

 

转载于:https://www.cnblogs.com/yaozhenhua/p/9296699.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows游戏编程_苹果的Mac和微软的Windows该如何选择?

WORK HARD FOR A BETTER LIFEMac&Windows如何选择&#xff1f;///教你认识Mac与Windows的区别正确选择最适合自己的电脑苹果Mac系列电脑一直属于小众化产品&#xff0c;使用的人较少。有些朋友给使用Macbook系列电脑的朋友打上“装X”、“华而不实”等标签。而使用MacBook的…

子网掩码相关教学 子网掩码快速算法 沉睡不醒blog

如果你希望每个子网中只有5个ip地址可以给机器用&#xff0c;那么你就最少需要准备给每个子网7个ip地址&#xff0c;因为需要加上两头的不可用的网络和广播ip&#xff0c;所以你需要选比7多的最近的那位&#xff0c;也就是8&#xff0c;就是说选每个子网8个ip。好&#xff0c;到…

Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析

Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析 一、介绍计算机网络体系结构 1.计算机的网络体系结构 在抓包分析TCP建立链接之前首先了解下计算机的网络通信的模型&#xff0c;我相信学习过计算机网络的都比较熟悉&#xff0c;如下图所示是一个OSI七层模型、TCP/IP…

代码 直接调节显示设备亮度_LED显示屏参数系列,亮度是什么,如何调节,如何选择...

亮度概念&#xff1a;亮度&#xff1a;在给定方向上&#xff0c; 每单位面积上的发光强度。亮度的单位是cd/m2&#xff0c;读作Candela per square metre&#xff08;坎德拉每平方米&#xff09;。有时候LED显示屏厂家会标示亮度单位为nit&#xff08;尼特&#xff09;&#xf…

r语言error in match.fun(fun) :_Go语言200行写区块链源代码分析

Github上有一个Repo&#xff0c;是一个使用Go语言(golang)&#xff0c;不到200行代码写的区块链源代码&#xff0c;准确的说是174行。原作者起了个名字是 Code your own blockchain in less than 200 lines of Go! 而且作者也为此写了一篇文章。https://medium.com/mycoralheal…

方案的写法

转至野路子吴鲁加的网络日志方案的写法今天看《胡雪岩》第二册P530提道&#xff1a;像这些“说贴”&#xff0c;最要紧的是简洁&#xff0c;要几句话就能把那些大官儿说动心&#xff0c;才是上品……这个说帖&#xff0c;王有龄、赵景贤一定会看完&#xff0c;但递到黄宗汉手中…

oracle distinct分页优化_Oracle SQL性能优化最常用的40条建议

关于Oracle SQL优化的内容&#xff0c;这一篇应该能满足常规大部分的应用优化需求&#xff0c;整整40条优化建议&#xff0c;干货满满。1. SQL语句执行步骤语法分析> 语义分析> 视图转换 >表达式转换> 选择优化器 >选择连接方式 >选择连接顺序 >选择数据的…

Python的文件

今天我们主要来讲一下关于Python文件的一些知识&#xff1a; 1、当我们先打开一个文件的时候&#xff0c;在Python中可以这样子做&#xff1a;使用open()函数&#xff0c;大概类似于这样&#xff1a;f open(lsf.txt)&#xff0c;你应该知道txt是记事本文件的后缀吧&#xff0c…

必须理解的分布式系统中雷同的集群技术及原理

写在前面 在当今信息爆炸的时代&#xff0c;单台计算机已经无法负载日益增长的业务发展&#xff0c;虽然也有性能强大的超级计算机&#xff0c;但是这种高端机不仅费用高昂&#xff0c;也不灵活&#xff0c;一般的企业是负担不起的&#xff0c;而且也损失不起&#xff0c;那么将…

如何获取.then的返回值_仅仅知道如何终止XHR请求,或许对你来说是不够的!

TLDR:当我们需要的时候&#xff0c;我们可以通过AbortController接口来终止一个或者多个请求。前言到目前为止&#xff0c;我们有两个常用的基本的手段去发送请求进而局部刷新页面内容&#xff0c;其一是XMR(XMLHttpRequest)&#xff0c;其二是fetch&#xff0c;我们一个个说XH…

Java - 常用工具类 - 集合框架

转载于:https://www.cnblogs.com/wnzhong/p/9309371.html

stunnel使用详解

http://www.stunnel.org/faq/args.htmlhttp://www.colasoft.com.cn/support/monitor_stunnel.php科来网络分析系统与stunnel结合使用科来网络分析系统是一款强大的网络检测分析工具&#xff0c;可对网络中未加密的数据传输进行检测分析并实时显示分析结果&#xff0c;包括用户的…

binlog日志_【删库跑路】使用Binlog日志恢复误删的MySQL数据

前言“删库跑路”是程序员经常谈起的话题&#xff0c;今天&#xff0c;我就要教大家如何删&#xff01;库&#xff01;跑&#xff01;路&#xff01;开个玩笑&#xff0c;今天文章的主题是如何使用Mysql内置的Binlog日志对误删的数据进行恢复&#xff0c;读完本文&#xff0c;你…

Java并发编程笔记之ThreadLocal内存泄漏探究

使用 ThreadLocal 不当可能会导致内存泄露&#xff0c;是什么原因导致的内存泄漏呢&#xff1f; 我们首先看一个例子&#xff0c;代码如下&#xff1a; /*** Created by cong on 2018/7/14.*/ public class ThreadLocalOutOfMemoryTest {static class LocalVariable {private L…

Res协议,专题

打造完美的&#xff29;&#xff25;网页木马 发表&#xff1a;2004-5-20 19:41:00 出处&#xff1a;你的博客网(yourblog.org) 打造完美的&#xff29;&#xff25;网页木马 icyfox &#xff08;测试页面:http://www.godog.y365.com/runexe/icyfox.htm&#xff0c;此处所…

springboot中获取bean_最新Spring Boot干货总结(超详细,建议收藏)

前言&#xff1a;本文非常长&#xff0c;建议先mark后看&#xff0c;也许是最后一次写这么长的文章说明&#xff1a;前面有4个小节关于Spring的基础知识分别是&#xff1a;IOC容器、JavaConfig、事件监听、SpringFactoriesLoader详解它们占据了本文的大部分内容&#xff1a;虽然…

python全栈学习总结三:函数学习

一函数基本概念 1 函数定义 def 函数名&#xff08;参数1&#xff0c;参数2&#xff0c;参数3&#xff0c;......&#xff09;: """ 功能&#xff1a; 参数1&#xff1a; 参数2&#xff1a; 参数3&#xff1a; ...... 返回值&#xff1a; """ 函…

街机模拟器联网简谈

Kawaks联网教程现在大多数模拟器的联网功能主要是靠"kaillera"来实现的,要想实现联网玩游戏,你必须有一个kaillera的客户端和一个服务器端的程序,客户端现在大多在模拟器中自带,而服务器端则是一个单独的程序.kaillera有多种操作系统,而大多是在windows下,好了废话不…

freeRTOS V10.0.1移植到STM32F407标准库 - 环境Keil5

最近因为工作需要用到FreeRTOS&#xff0c;其实开始本人内心是拒绝的因为自己只学习过UCOSIII还没实际上过什么大又复杂的工程&#xff0c;但是谁让FreeRTOS他是Free的呢公司成本考虑肯定是不会选择USOS的&#xff0c;这个道理就像公司内心深处不想给你涨工资一样。好了跑偏了言…

破解静态WEP KEY全过程

破解静态WEP KEY全过程广州卓讯盟科技有限公司 黄超毅Email:huangchaoyigzpia.com/demonalexdark2s.org发现首先通过NetStumbler确认客户端已在某AP的覆盖区内&#xff0c;并通过AP信号的参数进行‘踩点’&#xff08;数据搜集&#xff09;。NetStumbler 下载地址 http://www.n…