快速理解C语言指针

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

 

指针是什么? 函数

      指针自己是一个变量,它存储的是数据在内存中的地址而不是数据自己的值。它的定义以下: 学习

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


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

 

         首先咱们能够理解 int* 这个是要定义一个指针p,而后由于这个指针存储的是地址因此要对a取地址(&)将值赋给指针p,也就是说这个指针p指向a。spa

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

 

 

     

指针有什么用?code

   这样咱们就能够经过*p来找到指针所指向的变量a的地址,而后对地址中的值(值是10)进行操做。blog

//接着上面的代码

printf("%p",p)      //结果是一个地址(p指向的变量a的地址)。
printf("%d",*p)    //结果是10,变量a的值。
printf("%d",&p)   //结果是一个地址(指针p的地址,由于指针也是一个变量本身也有地址的)

 

数组名和指针的区别?内存

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

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的左边那就是不能修改地址中的值,在右边就是不能指向其余地址,左右都有那就是既不能修改地址的值也不能指向其余地址。 

       新手常出现的问题我我的总结了上述几点,若是有错误的地方但愿你们留言交流互相学习。后面会写下多维数组的存储方式和指针的问题。

相关文章
相关标签/搜索