指针学习(详解)

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

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

通常有两种的表示:

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 条评论
登录 后参与评论

相关文章

来自专栏佳爷的后花媛

数组(更新...)

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

563
来自专栏Python小屋

详解Python中的生成器表达式(generator expression)

生成器表达式(generator expression)也叫生成器推导式或生成器解析式,用法与列表推导式非常相似,在形式上生成器推导式使用圆括号(parenth...

3386
来自专栏ImportSource

一分钟告诉你java final 关键字运行原理

final关键字究竟是怎么运行的? 这是一个非常有趣的问题, import java.util.ArrayList; import java.util.List...

3488
来自专栏Bug生活2048

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

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

472
来自专栏用户2442861的专栏

Python中如何遍历字典

今天在写一个判断列表中的元素是否与字典中的key值相等的时候,需要用到字典的遍历,经过查阅资料,知道怎么遍历字典的key值;

361
来自专栏北京马哥教育

练习正则表达式

正则表达式可以通过元字符(规则)来匹配查找相关的的字符集合。他与通配符是有区别的。而且相关的使用工具对正则表示的元字符的是有区别的。 首先我们先来了解下常用的元...

2709
来自专栏Python

函数相关知识汇总

一.函数的定义 定义函数的规则: 1.定义:def 关键词开头,空格之后接函数名称和圆括号()。 2.参数:圆括号用来接收参数。若传入多个参数,参数之间用逗号分...

2295
来自专栏章鱼的慢慢技术路

多维数组的传递

1364
来自专栏小白客

Python基础学习-列表简介

一:列表是什么? 1 定义:列表是由一系列按特定顺序排列的元素组成。在Python中,用方括号[]来表示列表,并用逗号来分割其中的元素。 例: ? 输出: ? ...

3245
来自专栏Golang语言社区

Golang语言--变量作用域

作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。 Go 语言中变量可以在三个地方声明: 函数内定义的变量称为局部变量 函数外定义的变...

3236

扫码关注云+社区