快速理解C语言指针

新手在C语言的学习过程中遇到的最头疼的知识点应该就是指针了,指针在C语言中有非常大的用处。下面我就带着问题来写下我对于指针的一些理解。

指针是什么? 

指针本身是一个变量,它存储的是数据在内存中的地址而不是数据本身的值。它的定义如下:

 int  a=10,*p;
 p=&a

 int a=10;
 int *p=&a;

首先我们可以理解 int* 这个是要定义一个指针p,然后因为这个指针存储的是地址所以要对a取地址(&)将值赋给指针p,也就是说这个指针p指向a。

很多新手都会对这两种定义方法感到迷惑,其实他俩的意思是一样的。第一种定义方法定义了int型的变量a和指针p,然后将a的地址赋给p。第二种是在定义指针p的同时将a的地址赋给指针p。我们姑且理解为" int * "是定义指针的标志。

指针有什么用?

   这样我们就可以通过*p来找到指针所指向的变量a的地址,然后对地址中的值(值是10)进行操作。

//接着上面的代码

printf("%p",p)      //结果是一个地址(p指向的变量a的地址)。
printf("%d",*p)    //结果是10,变量a的值。
printf("%d",&p)   //结果是一个地址(指针p的地址,因为指针也是一个变量自己也有地址的)

数组名和指针的区别?

  数组名是一个地址,它可以被理解为一个常指针(它只能指向本数组首元素的地址)。而指针可以指其他的变量等等。

int str[5]={1,2,3,4,5};
int *p=str;
printf("%d",*p);    //输出为1,数组的首元素。
printf("%d",*str);  //输出为1,数组的首元素。
printf("%d",str[0]);  //输出为1,数组的首元素。
printf("%p",p);  //输出为地址,数组的地址。
printf("%p",str);  //输出为地址,数组的地址。
printf("%d",*(p+1));  //输出为2,数组的第二个元素。
printf("%d",*(srt+1));  //输出为2,数组的第二个元素。

对照代码大家可以很清晰的看到数组名在对内存中存储的数据进行操作的方法和结果是一样,但是数组名存储自己数组本身的首地址。

什么是空指针,野指针?

      在函数内部对指针进行赋值操作后,在函数执行完毕后,该指针就成了一个空指针(变量从栈中弹出)。但是通过动态地址分配(堆空间)的指针不会有上述问题。

free(p)后释放内存的指针为野指针。

关于const对于指针的限制问题

      

int a=10,b=20;
int * const p=&a;    //无法使p指向其他地址。
p=&b;                    //这样的操作是不允许的。
*p=20;                   //可以这样操作。

const int * p=&a;     //p可以指向其他地址。
p=&b;                      //可以操作。
*p=10;                     //操作不被允许。

const int * const p=&a   //p不能指向其他地址,也不能改变地址中的值。
p=&b;                      //操作不被允许。
*p=20;                     //操作不被允许。

总结:const在int的左边那就是不能修改地址中的值,在右边就是不能指向其他地址,左右都有那就是既不能修改地址的值也不能指向其他地址。

新手常出现的问题我个人总结了上述几点,如果有错误的地方希望大家留言交流互相学习。后面会写下多维数组的存储方式和指针的问题。

 

时间: 2024-12-16 18:21:48

快速理解C语言指针的相关文章

"深入理解C语言" 指针

本文对coolshell中的"深入理解C语言"这篇文章中提到的指针问题, 进行简要的分析. #include <stdio.h> int main(void){ int a[5]; printf("%x\n", a); printf("%x\n", a + 1); printf("%x\n", &a); printf("%x\n", &a + 1); return 0; } 假设

小强版之无码理解C语言指针

 1. 先从普通变量开始   2. 撸完变量撸指针   3. 故事情节进一步发展,此处少儿不宜   4. 奶茶妹妹捉奸,小强死定了   5. 源码欣赏  #include <stdio.h> int main(void){ // 剧情一. 先从普通变量开始,小强开总统套房,5342 走起! int suite = 5342; //剧情二 撸完变量撸指针,开房二套, 彰显财气 int *_3p = &suite; printf("suite : %d\n", suit

正确理解C语言指针申明的含义

/*说明:*/ ? //文件名 : JudgeControlMode.h ? # ifndef _JUDGECONTROLMODE_H_ # define _JUDGECONTROLMODE_H_ ? //------------------------------------宏定义-------------------------------------------------- /* #define CHARGESOFTSTARTUPBOUND 4.5 #define CHARGEUPBOU

C语言指针的深入理解

指针是C语言中广泛使用的一种数据类型.运用指针编程是C语言最主要的风格之一. 利用指针变量可以表示各种数据结构:能很方便地使用数组和字符串:并能象汇编语言一样处理内存地址,从而编出精练而高效的程序.指针极大地丰富了C语言的功能. 学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志. C语言为什么有指针以及指针有什么好处? 从大体上讲:指针是 C 语言区别于其他同时代高级语言的主要特征之一.其次因为数组或函数都是连续存放的.通过访问指针变量取得了数组或函数的首

C语言指针的陷阱

C语言指针的陷阱   分类: C/Cpp 转自:http://blog.csdn.net/porscheyin/article/details/3461670 "C语言诡异离奇,陷阱重重,却获得了巨大成功!"--C语言之父Dennis M.Ritchie.Ritchie大师的这句话体现了C语言的灵活性以及广泛的使用,但也揭示了C是一种在应用时要时刻注意自己行为的语言.C的设计哲学还是那句话:使用C的程序员应该知道自己在干什么.有时用C写的程序会出一些莫名其妙的错误,看似根源难寻,但仔细

快速学习C语言三: 开发环境, VIM配置, TCP基础,Linux开发基础,Socket开发基础

上次学了一些C开发相关的工具,这次再配置一下VIM,让开发过程更爽一些. 另外再学一些linux下网络开发的基础,好多人学C也是为了做网络开发. 开发环境 首先得有个Linux环境,有时候家里机器是Windows,装虚拟机也麻烦,所以还不如30块钱 买个腾讯云,用putty远程练上去写代码呢. 我一直都是putty+VIM在Linux下开发代码,好几年了,只要把putty和VIM配置好,其实 开发效率挺高的. 买好腾讯云后,装个Centos,会分配个外网IP,然后买个域名,在DNSPod解析过去

快速学习C语言一: Hello World

估计不会写C语言的同学也都听过C语言,从头开始快速学一下吧,以后肯定能用的上. 如果使用过其它类C的语言,如JAVA,C#等,学C的语法应该挺快的. 先快速学习并练习一些基本的语言要素,基本类型,表达式,函数,循环结构, 基本字符串操作, 基本指针操作,动态分配内存,使用结构表示复杂数据, 使用函数指针实现灵活逻辑. 虽然C是一个规模很小的语言,但也得自己多设计一些练习练手才能学会. 基本类型 我就记得char, int, 别的都不常用吧应该,用的时候再搜索. 表达式 和JAVA, C#差不多吧

C语言指针

C语言指针 指针是什么? 指针也是一个变量,但是这个变量存储的是一个地址,指向一个存储单元.我们可以根据指针(地址)找到他所指的变量,并对这个变量进行操作(赋值等).通过C里面的取地址符号&和取所指内容的符号*可以很方便的表示指针以及指针所指的变量之间的关系 /* ============================================================================ Name C语言指针 : text.c Author : Version : C

C语言指针讲解

指针是C语言的一种数据类型,类似于C中的其他类型,例如int ,char 等.既然指针是一种类型,当我们定义该类型变量,该类型变量就称为指针变量. C中有了指针就有了指向.指向:指针变量指向本身保存的内容(地址或指针)所表示的内存单元. C语言指针是一个特殊的变量,其里面储存的数值被解释成为内存里的一个地址. 在计算机中,所有对数据的操作,都是通过其地址进行的,指针让程序的效率更高,代码更少. 在学习指针的时间,一定要理解并区分指针的四个感念:指针的类型,指针所指向的类型,指针的值,指针本身所占