JNI入门之C/C++基础二

1.2指针类型  空指针  二级指针  指针运算  指针与数组

1.2.1指针为什么要有类型

指针有类型,地址没有类型

地址只是开始的位置,类型读取到什么位置结束(不同的类型读取的字节数不同)

1.2.2 NULL空指针

空指针的默认值为0

1)什么是空指针

如果 p 是一个指针变量,则 p = 0;、p = 0L;、p = '\0';、p = 3 - 3;、p = 0 * 17; 、p = NULL; 中的任何一种赋值操作之后(对于 C 来说还可以是 p = (void*)0;), p 都成为一个空指针

2) 如何判断一个指针是否是一个空指针?
这可以通过与空指针常量或者其它的空指针的比较来实现(注意与空指针的内部表示无关)。例如,假设 p 是一个指针变量,q 是一个同类型的空指针,要检查 p 是否是一个空指针,可以采用下列任意形式之一——它们在实现的功能上都是等价的,所不同的只是风格的差别。

指针变量 p 是空指针的判断:
if ( p == 0 )
if ( p == '\0' )
if ( p == 3 - 3 )
if ( p == NULL )  /* 使用 NULL 必须包含相应的标准库的头文件 */
if ( NULL == p )
if ( !p )
if ( p == q )
...

3) 空指针常量
0、0L、'\0'、3 - 3、0 * 17以及 (void*)0等都是空指针常量(注意 (char*) 0 不叫空指针常量,只是一个空指针值)。至于系统选取哪种形式作为空指针常量使用,则是实现相关的。一般的 C 系统选择 (void*)0 或者 0 的居多(也有个别的选择 0L);至于 C++ 系统,由于存在严格的类型转化的要求,void* 不能象 C 中那样自由转换为其它指针类型,所以通常选 0 作为空指针常量(tyc: C++标准推荐),而不选择 (void*)0。

1.2.3多级指针(二级指针)

指针保存的是变量的地址,如果保存的这个变量是一个指针变量,那么这个指针就是多级指针.

1.2.4指针的运算

指针的运算,一般在数组遍历时才有意义,基于数组在内存中线性排列的方式

1)      指针运算

void main(){

         //数组在内存中连续存储

         int ids[] = { 78, 90, 23, 65, 19 };

         //数组变量名:ids就是数组的首地址,以下三种表示效果相同

         printf("%#x\n",ids);

         printf("%#x\n",&ids);

         printf("%#x\n",&ids[0]);

         //指针变量

         int *p = ids;

         printf("%d\n",*p);

         //指针的加法

         p++; //p++向前移动sizeof(数据类型)个字节

         printf("p的值:%#x\n", p);

         //p--;

         printf("%d\n", *p);

         getchar();

}

 

 2)通过指针给数组赋值

void main(){

         int uids[5];

         //高级写法

         int i = 0;

         for (; i < 5; i++){

                   uids[i] = i;

         }

         //早些版本的写法

         int* p = uids;

         int i = 0; //i是数组元素的值

         for (; p < uids + 5; p++){

                   *p = i;

                   i++;

         }

 

         getchar();

}

 

1.2.5函数指针

函数指针

int msg(char* msg,char* title){

         MessageBox(0,msg,title,0);

         return 0;

}

void main(){

         //msg();

         printf("%#x\n",msg);

         printf("%#x\n",&msg);

         //函数返回值类型,函数指针的名称,函数的参数列表

         int(*fun_p)(char* msg, char* title) = msg;

         fun_p("消息内容","标题");

 

         getchar();

}

 函数指针定义方式:

函数返回值类型,*函数指针的名称,函数的参数列表 = 函数地址

int(*fun_p)(char* msg, char* title) = msg;

函数名即是函数的入口地址 所以 msg等同于&msg

 应用场景函数的参数列表是函数指针(函数的入口地址)

int add(int a,int b){

         return a + b;

}

 

int minus(int a,int b){

         return a - b;

}

 

void msg(int(*func_p)(int a, int b), int m, int n){

         int r = func_p(m, n);

         printf("执行结果:%d\n",r);

}

 

void main(){

         //加法

         msg(add, 10, 20);

         //减法

         //msg(minus,50,10);

         getchar();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值