指针学习(详解)

在指针中*是取内容,&是取地址

(在结构体中时:变量结构体用".",指针结构体用"->")

通常有两种的表示:

1. 通过指针向指向的地址内容赋值

*p=a; //将p指向的地址里赋a值

注意:若a和p定义的变量类型不一样时,需要用到强制转换才行.

当指针指向的地址内容是一个变量时,

实例如下:

int main()
{
int   *p=0x12345678;                     //定义一个int型指针*p,p=0x12345678这个地址。
char    a='0';                   //定义一个char型变量b
*p=(int)a;                 //*p等于a(0x12345678这个地址的内容等于a变量的值)          
}

当指针指向的地址内容是另一个指针指向的地址内容时,

实例如下:

int main()
{
int   *p=0x12345678;             //定义一个int型指针*p,p=0x12345678这个地址。
char    b='0';                   //定义一个char型变量b
char *a=&b;                //定义一个char型指针*a,a=&b,表示a指针的地址等于b的地址。
*p=*(int *)a;          //首先是先执行(int *)强制转换为int型指针,然后*p等于*a(0x12345678地址的内容等于'0'这个变量)          

}

2. 指针指向其它的地址

p=&a; //将p的地址 指向a的地址

   它和"int a=0,*p=&a;"一个意思,这里的*只是代表定义一个指针(不是指向地址的内容),然后指针p=&a;

实例如下:

int main()
{
int a=0,*p; //定义一个int型指针p,p等于0x12345678这个地址。
p=&a; //p等于a的地址,则*p=0
}

3.指针地址与数值相加

   指针地址与数值相加和数值与数值相加不一样,

char型指针:0X3000+1=0X3001           (因为1个地址保存8位数据,而char是8位.)

short型指针:0X3000+1=0X3002          (16位)

int、long型指针:0X3000+1=0X3004    (32位)

long long型指针:0X3000+1=0X3008   (64位)

变量与变量相加,实例如下:

#include "stdio.h"

 #define tag_next(t)    ((int *)((unsigned long)(t) + 1))   
int main()
{
    int i=3,*t=&i;
    printf("  %x,%d\n", t,*t);    
    t=tag_next(t);         //t=  *(t+1)
    printf("  %x,%d\n", t,*t);    
}

这里的tag_next(t): 将t地址强制转换为u32变量,与另一个变量1相加

代码输出如下:

 也就是t=0X28ff18+1=0x28ff19

int型指针地址与变量相加,实例如下:

#include "stdio.h"

 #define tag_next(t)    ((int *)((unsigned int*)(t) + 1))
int main()
{
    int i=3,*t=&i;
    printf("  %x,%d\n", t,*t);
    t=tag_next(t);               //t=*((unsigned long *)t +1)
    printf("  %x,%d\n", t,*t);    
}

这里的tag_next(t): 将t地址强制转换为u32*指针,然后这个指针地址与另一个变量1相加

代码输出如下:

也就是t=0X28ff18+1=0x28ff18+4=0x28ff1c

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏WD学习记录

牛客网 正则表达式匹配

请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是...

742
来自专栏佳爷的后花媛

数组(更新...)

在学习语言时,我们都会遇到数组.大学期间学过C,C++,Java,C#.这些语言中都学了数组,那时候用的不多,概念比较模糊,现在又学了php,里面也有数组,就打...

633
来自专栏PHP在线

简单PHP数组函数介绍

1.取数组第一个元素,使用$array[0]呢?还是reset($array); 分析:如果仅限于数值数组,对于一个大小为1的数组,将返回$array[0]。不...

3227
来自专栏CDA数据分析师

教你一招 | Python: 函数参数魔法

函数参数 在 Python 中,定义函数和调用函数都很简单,但如何定义函数参数和传递函数参数,则涉及到一些套路了。总的来说,Python 的函数参数主要分为以下...

1789
来自专栏King_3的技术专栏

leetcode-165-比较版本号

比较两个版本号 version1 和 version2。 如果 version1 > version2 返回 1,如果 version1 < version2 ...

1132
来自专栏Bug生活2048

Python自学之路-内置函数说明及实例(四)

如果提供了promat参数,首先将参数值输出到标准的输出,并且不换行。函数读取用户输入的值,将其转换成字符串。

492
来自专栏信安之路

python 2.7正则上篇

根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。可以提高正则的匹配速度,重复利用正则表达式对象。

530
来自专栏软件开发 -- 分享 互助 成长

C++STL之map的基本操作

STL中基本的关联式容器有map和set,它们都是以红黑树作为其底层的结构,具有非常高的查找、删除效率,内容会按照键值自动排序。 使用map的注意事项: 1、关...

1899
来自专栏V站

PHP常用系统内置函数,收藏以后别折磨自己写函数类了

1329
来自专栏十月梦想

PHP数据类型转换

        Java,c,c++等强类型语言必须先声明数据类型,java和c声明一个整数型(int a=100;)

611

扫码关注云+社区