C语言指针基本操作

指针 

指针介绍

如果说C语言最有魅力的地方在哪,那么毋庸置疑,非指针莫属了。

众所周知,C语言中每个变量都有一个内存地址,可以通过&进行访问。指针是一个变量,它的值是一个变量的内存地址【注意是内存地址】。

指针表达式:

type *var-name;
//其中type代表C语言的数据类型,例如:int,double,char,float

指针

  1. 指针声明

    指针进行声明时,=的右边必须为内存地址,不可以是变量(但是int*p=0;除外,该语句表示指针为空)

  2. 指针初始化

    在初始化指针的时候,如果暂时不需要赋值,可以将值赋值为NULL,可称为空指针。ps: *不赋值NULL也行,不过赋值NULL是一种好习惯,但是如果定义指针数组,大可不必这样。

指针最基本使用

首先先介绍一下指针最基本最基本的使用

#include <stdio.h>
void main(){
int a = 10;
int *p =NULL; //如果将其写成 int *p = 10;那么程序肯定会报错,但是如果写成 int *p = 0,不会报错
printf("指针赋值前的地址:%p\n",p);
printf("变量a的地址:%p\n",&a);
p = &a;//将变量a地址赋值给指针
printf("指针赋值后的地址:%p\n",p);
printf("指针访问值:%d\n",*p);
}

输出结果是:

指针赋值前的地址:(nil)
变量a的地址:0x7ffef9a9655c
指针赋值后的地址:0x7ffef9a9655c
指针访问值:10

ps:(nil)就代表空的意思,不同的编译器显示不同。

解释一下原理

可以简单的理解为:

如果在*p中,p代表一个内存地址,而这个内存地址中储存了一个值,那么使用*可以将这个值取出来,则*p就代表这个内存地址中的值。

例如:

#include <stdio.h>
void main(){
int a = 10;
printf("结果是:%d",*(&a));
}

运行结果:

结果是:10

指针的基本应用

指针与数组不可说的秘密

简单点来说,指针跟数组没有半毛钱关系。只是说,经常将指针和数组拿过来共同使用,于是乎,两者便有了点关系。

指针数组

指针数组定义与数组定义类似

int a[10];//定义一个数组
int *p[10];//定义一个指针数组

使用案例:

#include <stdio.h>

void main()
{
int a[] = {10,20,30};
int *p[3]; //此时不要写成 int *p[3] =NULL;
for(int i =0;i<3;i++){
p[i] = &a[i]; //对指针数组元素进行赋值
}
for(int j=0;j<3;j++){
printf("第%d个值是%d\n",j,*p[j]);
}
}

运行结果:

第0个值是10
第1个值是20
第2个值是30

指针与数组

  1. 首先先说一下指针运算

    指针运算有点奇葩,和平常的有点不一样。假设ptr是一个指向int32位整数类型的指针,所指的地址是100,那么执行

    ptr++

    所得到结果是ptr将指向104

    对指针进行自加自减的操作,所加或者所减的值会根据数据类型而不同,可知,char类型的指针自加自减的值为1

  2. 指针指向数组

    int var[]={10,20,30};
    int *p = NULL;
    //将p指向数组的首个元素地址
    p = var;
    //等价于
    p = &var[0];
  3. 指针和数组

    #include <stdio.h>
    
    void main(){
    int var[] = {10,20,30};
    int *p;
    p = var; //也可写做 p = &var[0];
    for(int i = 0;i<3;i++){
    printf("p所指向的地址:%p\n",p);
    printf("p所指向的值:%d\n",*p);
    p++;
    }
    }

    运行结果

     p所指向的地址:0x7fff9aa44a2c
    p所指向的值:10
    p所指向的地址:0x7fff9aa44a30
    p所指向的值:20
    p所指向的地址:0x7fff9aa44a34
    p所指向的值:30

emm,简单的指针的使用就介绍到这里了,在下一篇中,我将会再介绍一下指针的其他操作

C语言指针基本操作的更多相关文章

  1. C语言指针的高级操作

    C语言指针的高级操作 指针  指针 在上篇博客中我介绍了C语言指针的最基本操作,那么我在这篇博客中会介绍一下C语言指针的一些骚操作. 指向指针的指针 这名字乍一听有点拗口,再次一听就更加拗口了.先看定 ...

  2. C语言指针转换为intptr_t类型

    1.前言 今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量.由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针.感觉很奇怪,为何要将一个指针 ...

  3. [转]C语言指针学习经验总结浅谈

    指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...

  4. 不可或缺 Windows Native (7) - C 语言: 指针

    [源码下载] 不可或缺 Windows Native (7) - C 语言: 指针 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #i ...

  5. C语言指针学习

    C语言学过好久了,对于其中的指针却没有非常明确的认识,趁着有机会来好好学习一下,总结一下学过的知识,知识来自C语言指针详解一文 一:指针的概念 指针是一个特殊的变量,里面存储的数值是内存里的一个地址. ...

  6. (转载)c语言指针学习

    前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水, ...

  7. 关于C语言指针的问题

    在学习关于C语言指针的时候,发现这样一个问题,代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h&g ...

  8. C语言指针类型 强制转换

    关于C语言指针类型 强制转换  引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...

  9. C语言指针和数组知识总结(上)

    C语言指针和数组知识总结(上) 一.指针的基础 1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是:  %08x 2.指针的本质 指针的本质就是变量,那么既然是变量,那么一定会分配地址 ...

随机推荐

  1. Chapter3_操作符_其他操作符

    对java中其他操作符及一些注意事项的总结 (1)按位操作符 按位操作符操作基本整数类型中的单个二进制位,有与(&),或(|),非(~).按位操作符还可以和等号(=)联合使用,如~=,& ...

  2. Zookeeper Client基础操作和Java调用

    ## Zookeeper > Zookeeper目前用来做数据同步,再各个服务之前同步关键信息 i.客户端操作 1. 创建 create [-s] [-e] path data acl -s 为 ...

  3. tensorflow学习之(三)Varible 变量的使用

    #Varible 变量的使用 使用变量进行自加 import tensorflow as tf state = tf.Variable(0,name='counter') #定义一个变量,赋值为0,且 ...

  4. Note | 学术论文写作方法和技巧

    目录 1. 论文发表流程 2. 确定科研方向 3. 思考问题和解决问题 4. 审稿 5. 论文写作 5.1. 标题 5.2. 摘要 5.3.介绍 5.4. 相关工作 5.5. 段落 5.6. 方法 5 ...

  5. Android Studio中的大量findViewById

    一. 分析 在Android Studio中开发时,findViewById是用的最多的函数之一.经常需要对返回的view进行类型转换,输入麻烦.代码丑陋. 本文提供两种方案来解决这个问题: 1.安装 ...

  6. MySQL 基础--时间戳类型

    时间戳数据存储 .TimeStamp的取值范围为'1970-01-01 00:00:01' UTC 至'2038-01-19 03:14:07' UTC: .在存储时间戳数据时先将数据转换为UTC时区 ...

  7. 【算法】实现字典API:有序数组和无序链表

    参考资料 <算法(java)>                           — — Robert Sedgewick, Kevin Wayne <数据结构>       ...

  8. InnoDB体系架构(一)后台线程

    InnoDB体系架构——后台线程 上一篇已经了解了MySQL数据库的体系结构 这一篇除了介绍InnoDB存储引擎的体系架构外,同时进一步了解InnoDB的后台线程. InnoDB存储引擎是多线程的模型 ...

  9. virtual box 下安装centos 7

    1: 在virtual box下导入 镜像的时候报错: Failed to open/create the internal network 'HostInterfaceNetworking-Virt ...

  10. 写一个shell 快速启动停止你的微服务吧

    在这个微服务盛行的时代,docker获得了巨大的成功,因为我们需要在一台服务器装上N个服务. 本文不是想讨论如何使用docker,而是,在一台服务器安装了多个服务后,怎样启动方便的启动服务呢? 一.在 ...