首页 技术 正文
技术 2022年11月9日
0 收藏 396 点赞 2,234 浏览 2195 个字

版权声明:本文出自阿钟的博客,转载请注明出处: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");
}

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

总结: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);
}

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

答案是没有变化的:因为此时修改了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);
}

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

答案是没有变化的:因为此时将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);
}

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

答案是有变化的:因为此时修改了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);
}

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

答案是有变化的:因为*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");
}

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

五:函数返回多个值

#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的地址并没有改变,改变的是他们的值;好了到这里对指针,指针变量的初步认识就讲完了。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,497
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,910
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,744
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,498
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,135
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,298