Android 下 JNI 开发Day1

11、指针和数组的关系-34

1、数组简介

创建文件“指针和数组的关系.c

#include<stdio.h>

#include<stdlib.h>

/**

  指针和数组的关系

*/    

main()

{

      int iArray[] = {1,2,3,4,5,6} ;

      char cArray[] ={'h','e','l','l','o'};   

      printf("iArray[0]=%d\n",iArray[0]);  

      printf("iArray[1]=%d\n",iArray[1]);         

      printf("cArray[0]=%c\n",cArray[0]);  

      printf("cArray[1]=%c\n",cArray[1]);       

     system("pause");                 

}    

运行结果如下:

打印int数组地址

main()

{

      int iArray[] = {1,2,3,4,5,6} ;

      char cArray[] ={'h','e','l','l','o'};         

      printf("iArray[0]=%d\n",iArray[0]);  

      printf("iArray[1]=%d\n",iArray[1]);      

      printf("iArray[0]的地址=%#x\n",&iArray[0]);

      printf("iArray[1]的地址=%#x\n",&iArray[1]);      

      printf("iArray[2]的地址=%#x\n",&iArray[2]);      

      printf("cArray[0]=%c\n",cArray[0]);  

      printf("cArray[1]=%c\n",cArray[1]);     

     system("pause");            

}    

运行结果如下:

说明,每个int占4个字节

2、数组是一块连续的内存空间

main()

{

      int iArray[] = {1,2,3,4,5,6} ;

      char cArray[] ={'h','e','l','l','o'};         

      printf("iArray[0]=%d\n",iArray[0]);  

      printf("iArray[1]=%d\n",iArray[1]);      

      printf("iArray[0]的地址=%#x\n",&iArray[0]);

      printf("iArray[1]的地址=%#x\n",&iArray[1]);      

      printf("iArray[2]的地址=%#x\n",&iArray[2]);      

      printf("cArray[0]=%c\n",cArray[0]);  

      printf("cArray[1]=%c\n",cArray[1]);        

      printf("cArray[0]的地址=%#x\n",&cArray[0]);

      printf("cArray[1]的地址=%#x\n",&cArray[1]);      

      printf("cArray[2]的地址=%#x\n",&cArray[2]);  

     system("pause");                  

}   

运行结果如图:

图中可以看出c语言中char占1个字节

3、地址超出16制中A是10,12是C 

printf("iArray[0]的地址=%#x\n",&iArray[0]);

printf("iArray[1]的地址=%#x\n",&iArray[1]);      

printf("iArray[2]的地址=%#x\n",&iArray[2]);

printf("iArray[3]的地址=%#x\n",&iArray[3]);

4、数组的名称的地址就是数组第一个元素的地址(首地址) 

main()

{

      int iArray[] = {1,2,3,4,5,6} ;

      char cArray[] ={'h','e','l','l','o'};        

      printf("iArray[0]=%d\n",iArray[0]);  

      printf("iArray[1]=%d\n",iArray[1]);      

      printf("iArray的地址=%#x\n",&iArray);

      printf("iArray[0]的地址=%#x\n",&iArray[0]);

      printf("iArray[1]的地址=%#x\n",&iArray[1]);      

      printf("iArray[2]的地址=%#x\n",&iArray[2]);

      printf("iArray[3]的地址=%#x\n",&iArray[3]);      

      printf("cArray[0]=%c\n",cArray[0]);  

      printf("cArray[1]=%c\n",cArray[1]);  

      printf("cArray的地址=%#x\n",&cArray);

      printf("cArray[0]的地址=%#x\n",&cArray[0]);

      printf("cArray[1]的地址=%#x\n",&cArray[1]);      

      printf("cArray[2]的地址=%#x\n",&cArray[2]);  

     system("pause");                   

}  

运行如图

画图分析数组:

2、用户输入数组

单独创建一个文件“用户输入数组.c”

#include<stdio.h>

#include<stdlib.h>

/*

用户输入数组

//输入函数

scanf("占位符",地址);

*/

main()

{

     //1.让用户输入数组的长度;

     printf("请输入数组的长度:");

     int length ;

     scanf("%d",&length);

     printf("数组的长度为:%d\n",length);    

     //2.根据用户输入的长度,创建数组

     int iArray[length];     

     //3.让用户把数组元素依次输入

     int i;

     for(i =0;i<length;i++){     

           printf("请输入第%d元素的值:\n",i);

           scanf("%d",&iArray[i]);

     }     

     //4.把数组中的内容输出来

     for(i=0;i<length;i++){

            printf("输入第[%d]元素的值:%d\n",i,iArray[i]);                                          

     }    

     system("pause");                 

}       

3、指针的长度

创建文件“指针的长度.c”

所有的指针的长度都是4个字节 

不管什么类型的指针都是4个字节.

C语言为了方便指针运算, 定义各种基本类型的指针, 每种类型的指针运算时所偏移量的值是根据类型的长度决定的.

#include<stdio.h>

#include<stdlib.h>

/*

指针的长度

sizeof();

所有的指针的长度都是4个字节

在数组运算是有问题,所有的移动都是4个字节;那么char short等是不是就有问题了

*/

main()

{

     int* iPoint ;     

     char* cPoint;

     printf("int*指针的长度为:%d\n",sizeof(iPoint));

     printf("char*指针的长度为:%d\n",sizeof(cPoint));  

     system("pause");                 

}      

运行结果:

4、数组的运算

输出地址找规律:

创建文件“数组的运算.c”

main()

{          

     int iArray[]= {1,2,3,4,5};     

     printf("&iArray地址:%#x\n",&iArray);     

     printf("iArray地址:%#x\n",iArray);

     printf("iArray[0]的地址:%#x\n",iArray+0);

     printf("iArray[1]的地址:%#x\n",iArray+1);

     printf("iArray[2]的地址:%#x\n",iArray+2);

     printf("iArray[3]的地址:%#x\n",iArray+3);

     printf("iArray[4]的地址:%#x\n",iArray+4);  

     system("pause");                 

}       

运行结果:

取值找规律

   int iArray[]= {1,2,3,4,5};

  // printf("&iArray地址:%#x\n",&iArray);     

   // printf("iArray地址:%#x\n",iArray);

   //printf("iArray+1地址:%#x\n",iArray+1);     

    / //得到对应的值

    printf("iArray[0]:%d\n",*iArray + 0);

    printf("iArray[1]:%d\n",*iArray + 1);

    printf("iArray[2]:%d\n",*iArray + 2);

    printf("iArray[3]:%d\n",*iArray + 3);

    printf("iArray[4]:%d\n",*iArray + 4);       

    printf("iArray[0]:%d\n",*(iArray + 0));

    printf("iArray[1]:%d\n",*(iArray + 1));

    printf("iArray[2]:%d\n",*(iArray + 2));

    printf("iArray[3]:%d\n",*(iArray + 3));

    printf("iArray[4]:%d\n",*(iArray + 4));

运行结果如下:

数组在移动时,会根据类型移动指定的字节;

例如:int类型的数组,在+1时,会跳过4个字节;

          char类型的数组,在+1是,会跳过1个字节;

根据上面思想内容,改造用“户输入数组.c如下”:

#include<stdio.h>

#include<stdlib.h>

/*

用户输入数组

//输入函数

scanf("占位符",地址);

*/

main()

{

     //1.让用户输入数组的长度;

     printf("请输入数组的长度:");

     int length ;

     scanf("%d",&length);

     printf("数组的长度为:%d\n",length);          

     //2.更加用户输入的长度,创建数组

     int iArray[length];     

     //3.让用户把数组元素依次输入

     int i;

     for(i =0;i<length;i++){     

           printf("请输入第%d元素的值:\n",i);

           //scanf("%d",&iArray[i]);

           scanf("%d",iArray+i);           

     }     

     //4.把数组中的内容输出来

     for(i=0;i<length;i++){

            //printf("输入第[%d]元素的值:%d\n",i,iArray[i]);  

            printf("输入第[%d]元素的值:%d\n",i,*(iArray+i));                                          

     }    

     system("pause");                 

}       

数组名

int a[5]; // a是数组名,5是数组的大小,元素个数

数组名称是个指针常量,它存放的是数组中第一个元素的地址

int a[5];

&a[0]  等价于 &a

下标和指针的关系

int a[5];

a[i] 等价于 *(a + i)  // 这里i的范围是0~4(数组长度 -1)