复习
1、一级指针
int*p 指向int的指针
赋值 int x;
p=&x;//
*p=2;
指针指向的谁 解引用之后就是谁
2、内存四区
堆区 需要自己手动申请内存 自己释放 (malloc free realloc(内存重新分配) alloc(比malloc多了一个赋值默认值的操作))
内存大
栈区 函数定义的变量 在栈区 系统会自动申请 回收内存 系统管理的内存很少
全局常量 全局(函数在外面) 静态 static int x=1 char*p="hello" (常量区的数据不能修改)
代码区
3、动态数组
int arr[10];
动态数组 在堆区的数组
int *p;
p=(int*)malloc(sizeof(int)*10);//在堆区申请一块内存当做数组使用
//p[0] p[1] p[2]
//*(p+0) *(p+1) *(p+2)

1、定义字符数组的时候 赋值字符串(有\0)
2、scanf gets strcpy (自动加\0)
循环赋值 手动添加

新内容
1、多级指针(二级指针)
指向指针的指针 存放的是指针的地址
2、指针运算
* [] & + - ++ --
* 解引用 主要用于指针 取得指针指向的元素(取值)
(同样可以用于数组)
[] 同样有解引用的作用
arr[2]//去下标为2的元素 *(arr+2) 数组指针都可以这样用
*(arr+2) *(arr+2)--->2[arr]
*(arr+2) arr是指针或者数组名n是int--->arr[n]
*(p+n)等价p[n]
& 取变量地址

指针可以进行加减运算
指针和int进行加减
p+1--->&p[1]//指针的运算 p+1指向下一个元素
指针的++和--(指针运算 也有越界的可能 p+9---->arr[10]越界)
指针和指针 相加没有意义
指针和指针相减 指向同一个数组的不同元素的指针可以相减 其他情况没有意义
p指向arr[4] q指向arr[7]
p-q=4-7=-3(就是两个元素之间隔得多远 距离)
-->比较关系 > < 指向不同位置之间的元素可以相减(就是下标之间的相减)

3、数组和指针的关系
一维数组 对应的是以及指针
int arr[10]; int*p; p=arr;//数组名可一直接赋值一级指针
用法是一样的 数组名赋值的时候相当于数组首地址
用里面的元素 *p p[n]
(数组名 不能++ 常量不能++ 也不能赋值)

二维数组 (数组的数组)
int dArr[7][8];// dArr 首元素的地址 &dArr[0]//取一行的地址 数组的地址 对应 数组的指针
int(*pArr)[8]; //数组指针 pArr=dArr
数组名相当于数组首地址 不是变量 常量 但是不能作为左值 也不能++--
4、了解 const指针
const int x=10;//定义常量必须赋值 const修饰的常量不能修改
对于指针 有点特殊
const int*y;和int const*y;效果一样
const修饰的是*y y可以改变 但是*y不能修改
int *const z 指针常量
const直接修饰z 表示z不能修改 但是*z可以修改
C语言中 const修饰变量 在栈区
C++ 中 const修饰的是常量 在常量区

 #include<stdio.h>
#include<stdlib.h>
int main()
{
//int x;
//printf("请输入大小:\n");
//scanf_s("%d",&x);//scanf_s与scanf是由于vs的版本不一样所用的形式不一样 其效果一样
//char *p = (char*)malloc(sizeof(char)*x);//大小为x的数组
//for (int i = 0; i < x; ++i)
//{
// *(p + i) = 'A' + i;//随便赋的值 A=65
//}
//p[x - 1] = '\0';//最后一个元素
//puts(p);//打印内容
//int arr[10];
//arr[0];
//*(arr + 0);
//getchar();
//while (1);
//free(p);//释放p的内存 申请的内存必须释放
//return 0; //int x;
//printf("请输入大小:\n");
//scanf_s("%d",&x);//scanf_s与scanf是由于vs的版本不一样所用的形式不一样 其效果一样
//char *p = (char*)malloc(sizeof(char)*x);//大小为x的数组
//for (int i = 0; i < x; ++i)
//{
// *(p + i) = 'A' + i;//随便赋的值 A=65
//}
//p[x - 1] = '\0';//最后一个元素
//puts(p);//打印内容
//char **pp = &p;//得到的是指针变量的地址 一级指针的地址 用二级指针 保存
////pp保留的是p的地址 //int x;
//int*q = &x;//*q 代表着x
//int**qq = &q;//qq指向q *qq代表着q **qq代表着是*q 也就是说代表着x
//printf("x的地址:%p,\nq的地址:%p,\nqq的地址:%p\n",&x,&q,&qq);
//printf("q存放的值:%p,\nqq存放的值:%p\n",q,qq); //int arr[10];
//for (int i = 0; i < 10; ++i)
//{
// arr[i] = i;
// printf("%d\t",i[arr]);//i[arr] 一样 arr[i] *(arr+i)
//} //int arr[10];
//int*p = &arr[1];
//printf("arr[1]的地址:%p\n",p);//这是arr[1]的地址
//printf("p+3的值是:%p,\narr[4]的地址是:%p\n",p+3,&arr[4]); int dArr[][];
int(*pArr)[];//数组指针 8是列
pArr = dArr;//二维数组首地址赋值给数组指针
pArr[][];//解两次引用才是数组元素
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; ++j)
{
pArr[i][j];//dArr[i][j] 用指针操作数组中的元素
//相同的 *(*(pArr+i)+j);
}
} getchar();
while ();//防止闪屏
return ;
}

2018-07-25  11:46:15

C++学习(十九)(C语言部分)之 指针3的更多相关文章

  1. 强化学习(十九) AlphaGo Zero强化学习原理

    在强化学习(十八) 基于模拟的搜索与蒙特卡罗树搜索(MCTS)中,我们讨论了MCTS的原理和在棋类中的基本应用.这里我们在前一节MCTS的基础上,讨论下DeepMind的AlphaGo Zero强化学 ...

  2. Scala学习十九——解析

    一.本章要点 文法定义中的二选一.拼接.选项和重复在Scala组合子解析器中对应|.~.opt和rep 对于RegexParsers而言,字符串字面量和正则表达式匹配的是词法单元 用^^来处理解析结果 ...

  3. Python3.5 学习十九 Django分模块讲解 MTV+URL

    本节内容概述: 表单提交的Method使用规则:get 获取数据 post提交数据 单选使用get 多选使用getlist request.POST.getlist("favor" ...

  4. Spring学习(十九)----- Spring的五种事务配置详解

    前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ...

  5. python学习(十九)常见的第三方库

    原文链接:http://www.limerence2017.com/2017/12/28/python19/#more 介绍几个python中常见的第三方库. Pillow Pillow简称PIL,是 ...

  6. Android学习十九:ContentProvider初步

    一.Content Provider基本概念 1.ContentProvider为存储和获取数据提供了统一的接口.ContentProvide对数据进行封装.不用关心数据存储的细节.使用表的形式来组织 ...

  7. JavaWeb学习 (十九)————JavaBean

    一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...

  8. spring学习十九 常用注解

    1. @Component 创建类对象,相当于配置<bean/>2. @Service 与@Component 功能相同. 2.1 写在 ServiceImpl 类上.3. @Reposi ...

  9. Spring学习(十九)----- Spring与WEB容器整合

    首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出的结论是:listener -> ...

  10. ballerina 学习十九 安全编程

      ballerina 内部提供了几种常用的安全开发模型,token 认证(jwt) basic auth jwt 安全 参考代码 import ballerina/http; http:AuthPr ...

随机推荐

  1. Linux第六周作业

    一 实验过程 1 先进入LinuxKernel环境下,更新menu代码到最新版,用到的命令为rm menu -rf //强制删除当前menu,git clone http://git.shiyanlo ...

  2. WPF客户端实现.net升级

    客户端.net版本由3.5升级到4.5,首先把.net4.5的离线安装包添加到资源,程序运行的时候,从资源中生成离线安装包,并通过传递参数的方式执行静默安装命令,具体代码如下: private sta ...

  3. 逆袭之旅DAY16.东软实训.Oracle.序列

    2018-07-12 14:07:44 序列 序列1.创建序列create sequence 序列名 [increment by n] ---步长 [start with n] ---序列的起始值 序 ...

  4. VMware workstation 14 Pro下载、安装及激活码

    虚拟机安装 1.百度搜索VMware应用程序 2.功能介绍 3.下载完成 4.开始安装 双击应用程序开始安装 5.点击“下一步” 6.勾选“我接受” 选择“下一步” 7.安装文件的选择:1.默认安装路 ...

  5. 尚学堂java 答案解析 第六章

    本答案为本人个人编辑,仅供参考,如果读者发现,请私信本人或在下方评论,提醒本人修改 一.选择题 1.C 解析:对void下的函数,可以使用"return;"表示结束之意,但不能&q ...

  6. sea.js与require.js的区别

    随着ES6标准的module出台渐渐会退出历史舞台 首先原理上的区别 sea.js遵循CMD规范.书写方式类似node.js的书写模板代码.依赖的自动加载,配置的简洁清晰.说白了就是懒加载. requ ...

  7. jstree使用新的

    1.首先准备jstree树的dom元素 <p id="flowList_ul" class="flowList_ul"></p> 2.初 ...

  8. 栈回溯简单实现(x86)

    0x01  栈简介  首先局部变量的分配释放是通过调整栈指针实现的,栈为函数调用和定义局部变量提供了一块简单易用的空间,定义在栈上的变量不必考虑内存申请和释放.只要调整栈指针就可以分配和释放内存.   ...

  9. FPGA中IBERT核的应用(转)

    https://wenku.baidu.com/view/50a12d8b9ec3d5bbfd0a74f7.html (必看)    摘要 IBERT即集成式比特误码率测试仪,是Xilinx专门用于具 ...

  10. 网口扫盲二:Mac与Phy组成原理的简单分析(转)

    1. general 下图是网口结构简图.网口由CPU.MAC和PHY三部分组成.DMA控制器通常属于CPU的一部分,用虚线放在这里是为了表示DMA控制器可能会参与到网口数据传输中. 对于上述的三部分 ...