复习
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

最新文章

  1. app端上传文件至服务器后台,web端上传文件存储到服务器
  2. phpcms手机门户相关
  3. 第三方登录分享功能-ShareSDK for iOS适配问题记录
  4. 移植SlidingMenu Android library,和安装example出现的问题解决
  5. 转:Spring AOP术语
  6. CF 241E flights 最短路,重复迭代直到稳定 难度:3
  7. linux下重启mysql php nginx
  8. MySQL 体系架构
  9. C#中父窗口和子窗口之间实现控件互操作
  10. CentOS7 firewall的使用
  11. the process cannot access the file because it is being used by another process
  12. jQuery入门第二
  13. mybatis随笔四之MapperProxy
  14. 关于手残,搞废我的OLED屏幕的 追悼会
  15. Django之中间件
  16. 分布式存储ceph——(4)ceph 添加/删除osd
  17. OpenCV自带dnn的Example研究(2)— colorization
  18. listview reclyerview上下拉刷新
  19. Maven中使用本地JAR包
  20. Oracle_高级功能(4) 数据库存储结构

热门文章

  1. spark使用正则表达式读入多个文件
  2. 归并排序(Merging Sort)
  3. react全家桶-路由
  4. Linux学习: LCD驱动
  5. transiton,transform,animation,border-image
  6. Spring异步调用注解@Async的使用
  7. Linux 虚拟内存机制
  8. 究竟 javascript 错误处理有哪些类型?
  9. placeholder兼容性问题
  10. DIV垂直居中对齐