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. Alpha 冲刺 (5/10)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助前后端接口的开发 测试项目运行的服务器环 ...

  2. http错误代码提示

    1×× 保留 2×× 表示请求成功地接收 3×× 为完成请求客户需进一步细化请求 4×× 客户错误 5×× 服务器错误 200  正常:请求已完成.  201  正常:紧接 POST 命令.  202 ...

  3. Unity、C#读取XML

    有如下XML文件: <?xml version="1.0" encoding="UTF-8"?> <DataNode> <prov ...

  4. 第一个Python小爬虫

    这个爬虫是参考http://python.jobbole.com/81353/这篇文章写的 这篇文章可能年代过于久远,所以有些代码会报错,然后我自己稍微修改了一下,增加了一个getContentAll ...

  5. 前端vue框架 父组件与子组件之间的相互调用

    子组件调用父组件东西: 1.在父组件与子组件契合的标签的的template模板中绑定 v-bind:自定义一个名字=“要调用的名字” 2.在子组件的script中props:["自定义的名字 ...

  6. Solutions and Summay for Linked List Naive and Easy Questions

    1.Remove Linked List Elements package linkedlist; /* * Question: Remove all elements from a linked l ...

  7. 一行代码实现自定义转场动画--iOS自定义转场动画集

    WXSTransition 这款非常不错,力推 这是作者源码简书地址: http://www.jianshu.com/p/fd3154946919 这是作者源码github地址 https://git ...

  8. HTCVive使用

    1.设备的安装与配置 https://wenku.baidu.com/view/fa172fd7482fb4daa48d4b44.html?from=search 2.接入SDK.实现简单示例场景.更 ...

  9. 安装过redis集群,重新做集群办法:

    二:找到问题:这个地方IP的问题,以上是正确的版本,以前有问题的版本的Ip是127.0.0.1, 原因是这个地方以前我没注释redis.conf文件中的bind 127.0.0.1 然后做集群时使用的 ...

  10. 前端自动化部署方案-实践(配合shell)

    以下实例项目为vue项目,其他项目当然也雷同咯 在项目中建一个这个么脚本文件 不说了,上代码 #!/bin/sh handle=$1; env=$2; # 远程部署机 webhook # 如果用远程机 ...