C语言指针详细说明

**
指针、地址、与变量的关系
**

前言

很多时候我们在逆向的时候不得不接触到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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ks_coder

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值