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)