指针和数组的复习

总结:

指针 变量的运算:
指针变量不能相加,不能相乘,也不能相除
如果这两个指针所指向的是同一个连续空间中的不同存储单元
则这两个元素就能想减


一个指针变量到底占几个字节?
解答:
一个指针变量,无论它所指向的变量有多少个字节.都是4个字节
该变量本身都只占4个字节
一个变量的地址是用该变量的首字节来做地址的。

预备知识:

 sizeof (数据类型)
 功能:返回值就是该数据类型所占的字节数
 
 sizeof(变量名)
 功能:返回值是该变量所占的字节数

专题:
动态内存的分配

 传统数组的是缺点的:

  1.数组长度必须事先制定,而且只是一个常数,不能是变量。

 

  1. #include <stdio.h>  
  2.  
  3. void show(int *q)  
  4. {  
  5.  int b[6] = {1,2,3,4,5,6};  
  6.  *q = 88;   
  7. }  
  8.  
  9. void show1(int *q)  
  10. {  
  11.  /*  
  12.  show函数定义的数组,在show函数执行完毕过后,那么里面的数组b我也不能使用。  
  13.  传统定义方式的数组不能跨函数使用。   
  14.  */   
  15. }   
  16.  
  17. int main(void)  
  18. {  
  19.  /*  
  20.  1.数组长度是先规定的,而且只能是整型的常量,不能是变量。   
  21.  int b = 9;  
  22.  int a[5] = {1,2,3,4,5};  //4 个字节  5个数字  4×5 = 20个字节。   
  23.  */ 
  24.    
  25.  /*  
  26.  2.传统形式定义的数组,该数组的内存程序员是没有办法手动去释放它。  
  27.  在一个函数运行期间,系统为该函数数组所分配的内存空间是没有办法手动释放的  
  28.  除非该函数执行的程序自动结束,系统才会把这个函数释放掉。   
  29.    
  30.  int a[5] = {1,2,3,4,5};  //4 个字节  5个数字  4×5 = 20个字节。   
  31.  show(a);  
  32.  */ 
  33.    
  34.  /*  
  35.  数组的长度一旦定义,其长度就不能更改\  
  36.  因为数组是一个常量.所以不能被更改。   
  37.  int a[5] = {1,2,3,4,5};  
  38.  a[6] = {1,2,3,4,5,6};  
  39.  */   
  40.  int a[5] = {1,2,3,4,5};  
  41.  show(a);  
  42.  return 0;  
  43. }  
  44.  
  45.  
  46. /*  
  47. main函数结束完毕过后才自动释放掉。   
  48. */   

为什么需要动态的内存分配
 动态数组很好的解决了传递数组的缺陷
 传统数组也是叫做静态数组
 
 

  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. int main(void)  
  4. {  
  5.  int i =5;  //分配4个字节  
  6.  int *p = (int *)malloc(4);  
  7.  /*  
  8.   1.要使用malloc函数,必须添加malloc.h文件头   
  9.   2.malloc函数只有一个形参,并且形参是整型  
  10.   3.4表示请求系统为本程序分配4个字节  
  11.   4.malloc函数只能返回第一个字节的地址   
  12.   5.第六行是分配了8个字节。 *p是一个字节,p所指向的内存也占了4个字节。   
  13.   6.p本身所占的内存是静态分配的,而p所指向的内存地址是动态分配的。   
  14.     
  15.  */   
  16.  *p = 8; //*p代表的是一个int变量,只不过×p这个整型变量分配内存存储方式不同  
  17.  free(p); //表示把p所指向的内存给释放掉,但是p本身是一个内存是静态的,不能由程序员手动释放,p本身内存只能让那个  
  18.  //p变量所在的函数运行终止时由系统自动释放掉。  
  19.  printf("%d",*p);   
  20.    
  21.  return 0;  
  22. }