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. Django的内置登录、退出、修改密码方法

    Django中内置的登录.退出.修改密码方法. 1.url.py中使用django.contrib.auth中的views函数,django.views.generic中的TemplateView函数 ...

  2. 【APP测试(Android)】--硬件测试

  3. 《C#从现象到本质》读书笔记(七)第9章 泛型

    <C#从现象到本质>读书笔记(七)第9章 泛型 泛型的三大好处:类型安全,增强性能(避免装箱和拆箱),代码复用. 泛型方法是传入的参数至少有一个类型为T(尚未制定的类型,根据微软的命名规则 ...

  4. 【git】仓库目录下文件不加入版本控制

    如果文件未做过提交操作,在文件所在目录或上级目录新建.gitignore文本文件,将文件的相对路径写入,再将该文本文件提交,则目标文件将被git忽略. 补一个gitignore文件书写规范 2.至于已 ...

  5. CentOS7:ifconfig command not found解决

    https://blog.csdn.net/dandelion_drq/article/details/53503487

  6. bgfx入门练习1——切换图形API驱动模式DX与OpenGL

    翻了下上次编译bgfx是去年2月份的事了,最近正好想试试DX,OpenGL双驱动,看Urho3D和Klayge光封装就头痛,人又懒,写OpenGL时也基本glfw,于是想到bgfx,不如再试试. 发现 ...

  7. UART串口通讯协议

    一.UART定义 UART 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种通用的串行异步全双工数据收发传输器(总 ...

  8. 可遇不可求的Question之导入mysql中文乱码解决方法篇

    可遇不可求的Question之导入mysql中文乱码解决方法篇 先 set names utf8;然后 source c:\1.sql ?

  9. 用VerilogHDL设计一个与门逻辑,并进行前仿和后仿

    执行菜单命令[File]-[New Project Wizard…],创建工程向导. 在What is the working directory for this project?下选择项目存储地址 ...

  10. IDEA运行android项目一直是同一个apk

    1.IDEA运行android项目时不像eclipse和android studio那样直接运行,IDEA需要设置Artifacts,这样每次运行的时候它才能重新编译,以下附上步骤! 这样就可以了.