指针学习(详解)

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

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

通常有两种的表示:

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

相关文章

来自专栏编程心路

代码块相关的题,特么再也不会做错了!

代码块包括静态代码块和非静态代码块,另外还有构造函数,它们的执行顺序是面试中经常考的,理解了下面这些基本知识,特么再也不会做错了。

471
来自专栏尾尾部落

[剑指offer] 把数组排成最小的数

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字...

1212
来自专栏程序员互动联盟

【java基础】Java中instanceof关键字的理解

java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或...

3349
来自专栏武军超python专栏

2018年9月9日正则表达式随堂记

*********************** 今天遇到的新单词: element n元素,要素 multibyte n多字节 sequence n数列...

1004
来自专栏禁心尽力

Java异常总结

异常就是在程序中可能要发生的未知错误,java机制中异常分为2大类:Exception和Error。 对异常的处理方式有2种,一是将异常通过关键字throws抛...

2177
来自专栏靠谱PM

JavaScript基本语法(三)

一、数组的概念: 所谓数组,就是将多个元素(通常是同一类型)按一定顺序排列放到一个集合中,那么这个集合我们就称之为数组。

492
来自专栏程序员互动联盟

【编程基础】C语言逻辑运算符

C语言关系运算符和逻辑运算符几乎无所不在,比如在循环语句、分支语句、逻辑判断等语句块中都会出现。学好这部分对学好C语言具有重要作用。 C语言中有一共有如下6中...

3486
来自专栏java初学

static关键字

28610
来自专栏10km的专栏

javabean:boolean和Boolean类型的getter方法名是有区别的

javaBean中,要设置或获取某个property的值,就需要相应的get和set方法,对于primitive和自定义类类型的属性(如:property),g...

1769
来自专栏杨熹的专栏

Day 1-Java-imooc-3.运算符

课程地址:http://www.imooc.com/learn/85 总结图片来自 http://www.imooc.com/article/10535 ? 本...

3476

扫码关注云+社区