复习 数组
定义格式 类型 数组名[数组大小]
数组名+下标
int arr[2][3]={{1,2,3},{4,5,6}};
int arr[][3]={1,2,3,4,5,6};//二维数组定义的时候赋值 不能省略列 但可以省略行
内存地址 内存(字节) 每个字节编号(地址)
指针--->存放地址的类型 & 取地址 *取值(解引用)
指针定义
类型 *指针的名字 定义指针的格式 (类型 指针保存变量类型的地址)
(point 指针)
指针 可以通过地址修改/访问其他变量值
一般用在 内存申请+函数传参
指针 一般涉及到指针变量一个指向的方向
指针的类型
指针指向的数据的类型
指针--->内存 一条大街 每个字节--->门牌号(地址)
指针就是存放地址的变量
int *p
int 表明p指向一个int类型的变量
int* 表明指针是int*类型
使用过程中 p 表示指针变量 地址
*p 表示指针指向的内容 int
地址不一样 操作不一样
指针存的是什么东西 (地址)
指针如何赋值 如何使用(p *p)
p表示地址 *p是值
指针赋值 赋值变量的地址 &x 得到当前变量的地址
(每次运行的时候 变量地址未必一致)
NULL (特殊规定 指针没有指向任何变量 赋值)
指针 先复制 然后使用
变量没有赋值不能使用 指针没有赋值页不能使用
int x;
printf("%d",x);乱码
规定 如果指针没有指向内容 让指针赋值为NULL (相当于指针的默认值 需要手动赋值)
指针赋值后使用 *p
操作 *p操作指向变量的值
*解引用 只能用于指针
一级指针 int *p/double *p/float *p/char *p
内存的分配 一次程序运行的时候变量分配的地址是不变的
指针很麻烦 并且不实用
指针 1.能不能存值--->
int x;
int *p;
p=1;//操作是错误的 赋值时地址
int*p=x;//x int类型 赋值指针 错误的
p=&x;
指针 2.麻烦
指针去修改变量的值
变量可以通过变量名去修改
有一种情况 不能通过变量名去修改 必须用到指针 函数传参
指针 3.必须使用指针
内存四区 --->定义一个变量 (在内存中分配一块地址)
栈区 (定义变量 定义在栈区) 内存不需要管理 自动分配内存 自动释放 (缺点 栈溢出 大概只有4M空间 再大就管理不了) 例如arr[1000000000000];
堆区 (手动申请 手动释放 必须用指针操作) 手动确定数组大小(动态数组) 堆区
全局静态常量区 存放全局变量 静态变量 常量 (比栈区大)
代码区 (存放代码二进制)
函数里面定义的变量 在栈区
堆区 用函数申请释放
全局变量 放在main函数外面 在函数外部定义的变量
静态 static 修饰的变量
字符串常量---->存放在常量区 常量 数据不能修改
1 #include<stdio.h> 2 #include<stdlib.h>//srand rand sysytem malloc free 3 int main() 4 { 5 #if 0 6 7 int x = 0;//定义变量 赋值 8 //取到x的地址 9 int *p;//定义 定义变量 10 p= &x;//赋值 给指针赋值 11 printf("%p ",p);//打印p的值(地址) 12 *p = 20;//修改的x 操作*p和操作x 用指针去修改另外一个变量的值 13 if (p == NULL) 14 { 15 //说明指针没有指向任何内容 不能使用 *p 16 } 17 printf("%p ",p);//打印p的值(地址) 18 printf("%p ",&x);//打印地址 格式占位符%p 19 //假设需要申请一块空间 存放int malloc(sizeof(int)*1);//申请内存 返回一个地址 必须用指针保存 ()里面是申请的内存的大小 一般搭配sizeof 返回一个地址 括号里面的数字 表明大小 单位是字节 20 //malloc 内存申请 分配多少空间 21 22 //使用时和数组一样 23 int*q = (int*)malloc(sizeof(int)* 100); 24 *q=2;//操作第一个int *(q+n) 操作第n+1个int *(q+0)~*(q+99) 25 q[0] = 2;//q[n]相当于 *(q+n) 26 for (int i = 0; i < 100; ++i) 27 { 28 *(q + i) = i;//通过指针 使用堆内存 29 //或者 q[i]=i; 30 printf("%d",*(q+i)); 31 } 32 //q[100];//越界 33 //*(q+100);//越界 34 int*myPoint = (int*)malloc(sizeof(int)*x);//内存申请 数组在堆区 大小 是由变量来决定的 动态数组 35 //int arr[100];//数组大小必须是常量 静态数组 36 37 free(q);//堆区内存必须要手动释放 38 free(myPoint); 39 while (1) 40 { 41 malloc(sizeof(int)*1000); 42 } 43 #endif 44 45 #if 1 46 char mystr[] = "hello world";//mystr 数组 栈区 47 char *pstr = "hello world";//pstr定义的是指针 保存的是地址 保存的是字符串的地址 48 //char*pstr="hello world";//常量区 内容不能修改 49 //pstr = "hello world";//字符串的地址赋值给了pstr 50 mystr[0] = '1'; 51 //pstr[0] = '1';//用指针修改了常量区的内容 所以会报错 52 //*(pstr+0)='1'; 53 54 #endif 55 56 getchar(); 57 return 0; 58 }
1.指针 定义格式 int*p int表示p要指向的内容(p保存的变量的地址) *表示这是指针 p表示指针的名字
使用方式 赋值 用地址给指针赋值(需要一个额外的变量)
使用 *p 代表p指向的内容
2.内存四区
栈区
堆区
全局静态常量区(全局区)
代码区
3.特殊指针用法
堆区的内存申请释放 malloc free 头文件 stdlib.h
char*p="hello"和char arr[]="hello"的区别
注意事项 1.指针使用的时候必须向赋值然后使用
2.指针只能赋值地址
3.内存申请必须释放 不释放会占内存 直到重启
4.定义指针int*p
p相当于地址 *p相当于指向的内容
5.不同类型指针不能互相赋值 (类型不一样 操作也不一样)
//除了malloc 不考虑任何强转
2018-07-20 10:29:29