复习 数组
定义格式 类型 数组名[数组大小]
数组名+下标
 
 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\n",p);//打印p的值(地址) 12 *p = 20;//修改的x 操作*p和操作x 用指针去修改另外一个变量的值 13 if (p == NULL) 14 { 15 //说明指针没有指向任何内容 不能使用 *p 16 } 17 printf("%p\n",p);//打印p的值(地址) 18 printf("%p\n",&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
                    
                
                
            
        
浙公网安备 33010602011771号