**
指针、地址、与变量的关系
**
前言
很多时候我们在逆向的时候不得不接触到c代码,比如Android逆向以及ndk开发,如果你对c语言不了解是很难进行下去的,这篇文章让你清楚明了的了结c语言的应用。
1、指针类型的作用
-
指针,就是一个存储数据地址的变量。
-
指针类型是说明指针所指向的数据的类型,如果指针类型未知,即便指针地址已知,仍无法获取对于的值。
实例 1:指针类型明确
#include<stdio.h>
int main()
{
int num=6; // 数据num为int类型
int *p=# // 指针 p 为int类型
printf("%d\n",*p); // 输出指针所指向的数据,用%d,即int类型。
return 0;
}
输出结果:
6
实例 2:指针类型未知,为 void
#include<stdio.h>
int main()
{
int num=6; // 数据num为int类型
void *p=# // 指针类型为 void 类型,即未知类型
printf("%d\n",*p); // 输出指针所指向的数据。
return 0;
}
输出结果:
-
程序报错,无输出结果。
-
在未声明指针类型时,无法使用指针取出对应地址的值。
-
可以使用类型强制转换来达到输出数据,但与其强制转换,不如在最开始便声明指针类型。
实例 3:强制转换
#include<stdio.h>
int main()
{
int num=6; // 数据num为int类型
void *p=# // 指针类型为 void 类型,即未知类型
printf("%d\n",*((int*)p)); // 强制转换,输出指针所指向的数据。
return 0;
}
实例 4:字符类型
#include<stdio.h>
int main()
{
char s='K'; // 定义char类型变量
char *p=&s; // 定义char类型指针,并存入地址
printf("%c\n",*p); // 字符类型使用%c输出
return 0;
}
输出结果:
K
实例 5:字符类型使用 %d 输出
#include<stdio.h>
int main()
{
char s='K'; // 定义char类型变量
char *p=&s; // 定义char类型指针,并存入地址
printf("%d\n",*p); // 字符类型使用%d输出
return 0;
}
输出结果:
75
- 此时输出的是大写字符’K’ 所对应的 ASCII 码。
2、指针的赋值
方法 1:声明指针的同时赋值
int num=6;
int *p=#
方法 2:先声明指针,后赋值
int num=6;
int* p;
p = #
3、指针指向地址,与开辟内存空间的区别
实例 1:开辟内存空间
#include<stdio.h>
int main()
{
char str1[]="hahaha"; // 字符数组str1
char str2[]="hahaha"; // 字符数组str2
if(str1==str2) // 判断str1和str2是否是同一个字符串
{
printf("Yes");
}
else
{
printf("No");
}
return 0;
}
输出结果:
No
-
虽然对于数组来说,数组名就是首元素的地址
-
但字符数组在初始化时,会开辟一块新的空间来存储数据,代码中的 str1 和 str2 都开辟了一块属于自己的空间,每一块空间都有着属于自己的地址,虽然它们储存的字符串是一样的,都是 “hahaha”,但是它们实际的空间却是不同的,因此 str1 与 str2 并不是同一个字符串,所以输出 No。
-
图解:
-
实例 2:指针指向地址
#include<stdio.h>
int main()
{
char *str1="hahaha"; // 字符指针str1
char *str2="hahaha"; // 字符指针str2
if(str1==str2) // 判断str1和str2是否是同一个字符串
{
printf("Yes");
}
else
{
printf("No");
}
return 0;
}
输出结果:
Yes
-
在这段代码中 str1 和 str2 都是字符指针,字符指针指向的是一个地址,无论有多少个字符指针,只要指向的是同一个字符常量,那么实际上的内存地址都是相同的,只是有着不同的指针指向它,此时 str1 与 str2 指向的地址是相同的,是同一个字符串,因此输出 Yes。
-
图解:
结语
更多信息可以加v一起学习,欢迎大家一起交流:LGZ20010220