Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/。
一.什么是指针?
简单来说: 指针就是内存地址 内存地址就是指针。来看个小案例
#include<stdio.h>
#include<stdlib.h>
/**
指针就是内存地址
内存地址就是指针
*/
main() {
//定义一个int类型的变量i,并且赋值为10
int i=10;
//定义一个int类型的一级指针变量p
int* p;
//把i对应的地址给p变量
p=&i;
//指针取值*p:把p变量地址对应的值取出来
printf("*p=%d\n",*p);
//打印地址值
printf("p的地址值%#x\n",p);
system("pause");
}
总结:p保存的是一个地址值,而*p就是去取地址值所对应的值。
二.下面通过四个小案例来加深对指针和指针变量的理解,我们先说一下指针和指针变量的区别:
- 指针就是内存地址,内存地址就是指针
- 内存地址就是内存单元的编号
- 指针变量就是存放内存地址的变量
- 指针和指针变量是两个完全不同的概念
1.第一个例子,如果修改i的值,p值有变化吗?
#include<stdio.h>
#include<stdlib.h>
main() {
int i=100;
//p就是我们的指针变量,存放地址值
int *p=&i;
printf("i值修改之前,p的地址值是%#x\n",p);
i=200;
printf("i值修改之后,p的地址值是%#x\n",p);
}
答案是没有变化的:因为此时修改了i值,p引用的还是i的地址所以p不会有变化
2.第二个例子,如果修改p的值,i值有变化吗?
#include<stdio.h>
#include<stdlib.h>
main() {
int i=100;
int *p=&i;
printf("p值修改之前,i的值是%d\n",i);
int j=200;
p=&j;
printf("p值修改之后,i的值是%d\n",i);
}
答案是没有变化的:因为此时将j的地址给了p,而i并没有动所以i的值不变
3.第三个例子,如果修改i的值,*p值有变化吗?
#include<stdio.h>
#include<stdlib.h>
main() {
int i=100;
int *p=&i;
printf("i值修改之前,*p的值是%d\n",*p);
i=200;
printf("i值修改之后,*p的值是%d\n",*p);
}
答案是有变化的:因为此时修改了i值,*p引用的是i的地址指向的值,所以*p的值发生了改变
4.第四个例子,如果修改*p的值,i值有变化吗?
#include<stdio.h>
#include<stdlib.h>
main() {
int i=100;
int *p=&i;
printf("*p值修改之前,i的值是%d\n",i);
*p= 200;
printf("*p值修改之后,i的值是%d\n",i);
}
答案是有变化的:因为*p=200;此时是将*p引用的值修改为200,也就是修改了i的值。
三:”*”号的三种含义
- 数学运算符:3 * 7 = 21
- 定义指针变量:int* p;
- 指针运算符(取值):*p表示取p对应内存地址对应的值
四:操作内存地址实现将两个数进行互换
1.第一种:使用中间变量来互换,这一种也是我们最常用的一种方法
#include<stdio.h>
#include<stdlib.h>
/**
互换两个数
*/
main() {
int a = 100;
int b = 150;
//通过一个中间变量来互换
int temp = a;
a = b;
b = temp;
printf("a的值:%d\n",a);
printf("b的值:%d\n",b);
system("pause");
}
2.第二种:我们知道C语言是可以直接操作内存的,所以我们可以直接来改变a,b两个的内存地址指向的值。
#include<stdio.h>
#include<stdlib.h>
/**
互换两个数
*/
//通过互换两个数的地址值,来互换数字
void changeAdress(int* a,int* b) {
//temp取的是指针变量a对应的内存地址的值也就是100
int temp = *a;
//把a对应内存地址的值 修改为b对应内存地址的值
*a = *b;
//把b对应内存地址的值 修改为temp
*b = temp;
}
main() {
int a = 100;
int b = 150;
//分别将取a,b的地址
changeAdress(&a,&b);
printf("a的值:%d\n",a);
printf("b的值:%d\n",b);
system("pause");
}
五:函数返回多个值
#include<stdio.h>
#include<stdlib.h>
/**
函数返回多个值
通过修改指针变量引用的值,达到返回多个值的效果。
*/
void close(int* a,int* b) {
*a=0;
*b=0;
}
main() {
int a=1;
int b=1;
//调用函数
close(&a,&b);
printf("a=%d\n",a);
printf("b=%d\n",b);
//是docs窗口停留
system("pause");
}
总结起来其实并不难,互换就是将 a原来指向100改成指向150,将 b原来指向150改成指向100;也就是说a,b的地址并没有改变,改变的是他们的值;好了到这里对指针,指针变量的初步认识就讲完了。
Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值的更多相关文章
- Android jni 编程4(对基本类型二维整型数组的操作)
Android jni 编程 对于整型二维数组操作: 类型一:传入二维整型数组,返回一个整型值 类型二:传入二维整型数组,返回一个二维整型数组 声明方法: private native int Sum ...
- Android JNI学习(三)——Java与Native相互调用
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Android jni 编程(参数的传递,成员,方法的)相互访问
package com.test.androidjni; import android.app.Activity; import android.os.Bundle; import android.u ...
- 三、Android学习第三天——Activity的布局初步介绍(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 三.Android学习第三天——Activity的布局初步介绍 今天总结下 ...
- 有两个指针pa,pb分别指向有两个数,a,b,请写一个函数交换两个指针的指向,也就是让pa指向b,让pb指向a
题目:有两个指针pa,pb分别指向有两个数,a,b,请写一个函数交换两个指针的指向,也就是让pa指向b,让pb指向a,具体实现如下: #include<stdlib.h> #include ...
- C++ 利用指针和数组以及指针和结构体实现一个函数返回多个值
C++ 利用指针和数组实现一个函数返回多个值demo1 #include <iostream> using namespace std; int* test(int,int,int); i ...
- Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译 ...
- 【转】Android JNI编程—JNI基础
原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...
- 【转】android JNI编程 一些技巧(整理)
原文网址:http://blog.csdn.net/linweig/article/details/5203716 本篇将介绍在JNI编程中如何传递参数和返回值. 首先要强调的是,native方法不但 ...
随机推荐
- Bitmap Image Graphics
Bitmap Image Graphics private void DrawImagePointF(PaintEventArgs e){ // Create image. Image new ...
- BZOJ2329: [HNOI2011]括号修复(Splay)
解题思路: Replace.Swap.Invert都可以使用Splay完美解决(只需要解决一下标记冲突就好了). 最后只需要统计左右括号冲突就好了. 相当于动态统计最大前缀合和最小后缀和. 因为支持翻 ...
- Android Studio中怎样引用图片资源
随着不断接触Android Studio,越来越发现和Eclipse有着巨大的差别. 不管是表面的目录结构,还是内在对各种资源的管理. 本篇就来聊聊Android Studio中怎样来显示图片. 以及 ...
- “ping”命令的原理就是向对方主机发送UDP数据包,HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”
Socket 是一套建立在TCP/IP协议上的接口不是一个协议 应用层: HTTP FTP SMTP Web 传输层: 在两个应用程序之间提供了逻辑而不是物理的通信(TCP UDP) T ...
- Font Awesome 图标如何使用
Font Awesome 图标如何使用 一.总结 一句话总结:Font Awesome字体图标非常好用,直接引入font-awesome.css,然后就可以直接使用了,使用的时候是用的i标签. 1.字 ...
- css中的!important作用
css中的!important作用 一.总结 1.!important:是hack, 2.!important作用:让浏览器首选执行这个语句,当对同一个对象设置了多个同类型的属性的时候,首选执行这一个 ...
- 解决Cookie乱码
在Asp.net的HttpCookie中写入汉字,读取值为什么全是乱码?其实这是因 为文字编码而造成的,汉字是两个编码,所以才会搞出这么个乱码出来!其实解决的方法很简单:只要在写入Cookie时,先将 ...
- python缩进报错
1.这个错误应该已经好久了:也应该熟悉了才对 IndentationError: unexpected indent python 缩进错误:意外缩进Python 但今天的问题有点特殊,我想在程序中间 ...
- java线程——详解Callable、Future和FutureTask
回顾: 接上篇博客 java线程--三种创建线程的方式,这篇博客主要介绍第三种方式Callable和Future.比较继承Thread类和实现Runnable接口,接口更加灵活,使用更广泛.但这两种方 ...
- STL之vector容器的实现框架
说明:本文仅供学习交流,转载请标明出处,欢迎转载. 实现vector容器的思路等同于实现一个动态数组,以下我们參照源代码的相关资料,给出一个vector容器的大致框架,仅仅有声明,没给出详细的实现. ...