版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/。

目录(?)[+]

一.什么是指针?

简单来说: 指针就是内存地址      内存地址就是指针。来看个小案例

#include<stdio.h>
#include<stdlib.h>
/**指针就是内存地址内存地址就是指针*/
main() {//定义一个int类型的变量i,并且赋值为10int 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. 指针就是内存地址,内存地址就是指针
  2. 内存地址就是内存单元的编号
  3. 指针变量就是存放内存地址的变量
  4. 指针和指针变量是两个完全不同的概念

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的值。

三:”*”号的三种含义

  1. 数学运算符:3 * 7 = 21
  2. 定义指针变量:int* p;
  3. 指针运算符(取值):*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的地址并没有改变,改变的是他们的值;好了到这里对指针,指针变量的初步认识就讲完了。

转载于:https://www.cnblogs.com/Free-Thinker/p/6169313.html

Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值...相关推荐

  1. C语言通过指针间接的实现函数返回多个值

    C语言通过指针间接的实现函数返回多个值 本例题中通过把指针作为函数参数来传递,依次达到改变变量的值的目的,最后实现一个函数返回两个变量的值 int *X,*X应该被看成一个整体来看,表示一个整形. # ...

  2. 指针实现函数返回多个值

    通常情况下,函数如果有返回值,那么该函数的返回值类型必须和函数的类型一致,并且一个函数只能有一个返回值.下面我们通过指针来间接实现函数返回多个值 void caculator(int a,int b, ...

  3. Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组...

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译 ...

  4. C语言中 定义数组大小时 不能使用变量,编程达人 C语言中数组长度不能用变量定义吗...

    C语言里,所有变量空间都是在程序运行之初向系统申请的,包括指针,除了一些动态申请方式如malloc函数.没有申请的空间系统是不允许读写的.那么如果一个数组大小是变量定义,则在程序运行前不能确定数组大小 ...

  5. 【C 语言】内存四区原理 ( 常量区示例 | 不同函数返回的相同字符串的指针地址相同 )

    文章目录 前言 一.正常程序 二.获取相同的字符串内容 前言 C / C++ 编译器会对代码进行 词法分析 , 语法分析 , 句法分析 ; 然后对代码进行优化 ; 将 字符串常量 赋值给指针时 , 首 ...

  6. C语言异或交换两个数的原理解析-大厂面试题:不使用第三变量交换两个数的值

    常用操作交换两个数的值 常用的交换两个数值的方法一般是采用第三个变量,这种方法简单易懂,用代码举例 int main() {//交换两个整形变量int a = 3;int b = 5;int c = ...

  7. c语言不用第三个变量 实现两个数的对调,下面程序功能是不用第三个变量,实现两个数对调操作 ....docx...

    下面程序功能是不用第三个变量,实现两个数对调操作 ... [3.1]下面程序的功能是不用第三个变量,实现两个数的对调操作.#include main(){ int a,b:scanf("%d ...

  8. CorelDRAWX4的C++插件开发(三十九)纯C++插件开发(3)声明变量并暴露导出函数

    接上一节我们接下来声明一些需要用到的变量 // 声明CorelDRAW变量=VBA::Application类 VGCore::IVGApplication* corelApp = NULL; //声 ...

  9. 【C 语言】C 项目开发代码规范 ( 形参合法性判断 | 函数返回值局部变量 | 函数中不用全局变量 | 函数中使用局部变量接收形参 | 函数返回值 | 形参作返回值 | 形参返回值处理 )

    文章目录 一.C 项目开发代码规范 一.C 项目开发代码规范 上一篇博客 [C 语言]字符串模型 ( 键值对模型 ) 中 , 完成了字符串的 键值对 查找功能 , 代码不太规范 ; C 项目开发代码规 ...

最新文章

  1. async/await的实质理解
  2. 对于es6的小小理解之generator函数
  3. 工业以太网交换机的作用和工作原理详解
  4. “约见”面试官系列之常见面试题之第六十三篇之get和post区别(建议收藏)
  5. Spring Data JPA 从入门到精通~如何配置多数据源
  6. C++中的static 成员变量的一些注意点
  7. Hudson安装配置文档
  8. Cure Your Acne by NOT Eating This!
  9. Hadoop入门到精通(不断更新中。。。。)
  10. 经典Java入门视频教程免费下载
  11. 软考论文-写作大纲-备考思路总结
  12. 固定资产管理系统对企业的意义?
  13. rar password recover(rar密码恢复工具) v2.0.0.0
  14. 第01章 Tableau数据可视化概述
  15. python找列表中相邻数的个数_利用python求相邻数的方法示例
  16. 基于ichartjs在android上使用HTML5实现各种图表的类库
  17. ZLMediaKit启用webrtc编译
  18. springboot影院售票小程序毕业设计-附源码201532
  19. 洛谷 P4233 射命丸文的笔记 ntt
  20. 实现 fizzBuzz 函数,参数 Thum 与返回值的关系如下: 1、如果 Thum 能同时被 3 和 5 整除,返回字符串 fizzbuzz 2、如果 Thum 能被 3 整除,返回字符串 fiz

热门文章

  1. Using Markov Chains for Android Malware Detection
  2. JZOJ 5405. 【NOIP2017提高A组模拟10.10】Permutation
  3. 用matlab做一个有刻度的网格,已知45个点X Y Z的坐标值已知,如何用matlab画出网格图,另外每个小方格里带颜色 - 程序语言 - 小木虫 - 学术 科研 互动社区...
  4. Tex 表格注释实例
  5. 如何将SmartDraw中的图形导出LATEX可用的EPS格式?
  6. Transformer、BERT学习笔记
  7. ACL 2020 《Cross-Modality Relevance for Reasoning on Language and Vision》论文笔记
  8. mysql8.0最低需要多少内存_MySQL8.0内存相关参数介绍
  9. php 正则表达式 ies,正则表达式模式修正符(/ies)
  10. 医院计算机管理在品管圈中的应用,品管圈在医院管理中怎么用?看完就明白了...