一点点指针的理解

原创 2016年08月30日 20:10:29
int *a, b, c;//看起来像是声明了三个指针,实际上只有a被声明为int *

int *a, *b, *c;//才是正确的声明三个指针的方式,因此让*跟在变量后面看起来会更合理。

Q : 这里会问,int本身是值类型,用int就可以表示一个整数,那么int *a这种仅仅是把一个单整数放在堆空间罢了?
A :不是的。看完下面这个例子,再一起总结。

    char *message = "Hello world!";

这条语句把message声明为一个指向字符的指针,并用常量中第一个字符的地址对该指针进行初始化。

也就是说,这个message可以当作数组来用啊。

所以声明 int *a; 这里a可以当作数组来用的!
因为堆是连续的!

但是这里的message声明,很容易让人产生误解:是把“Hello World”赋给 *message的,但是你想,message只是一个字符的指针,装不下这么大的!

这个声明其实等同于:

char *message;
message = “Hello World!”; //“Hello World!”过来是把自己的anchor:第一个字符的地址给message

Q : 以下代码会报错,segment fault: 11 , why?

 #include<stdio.h>
int main(void)
{
    int array[4] = {1,2,3,4};
    int *a;
    for(int j = 0;j < 4; j++)
    {
        a[j] = j;
    }
    for(int i = 0; i < 4; i++)
    {
        printf("%d\n",a[i]);
    }
    return 0;
}

但是,int array[] 与int *a单独使用都不出错,也就是int *a可以当作数组使用!

#include<stdio.h>
int main(void)
{
    int array[4] = {1,2,3,4};
    int *a = array;

    for(int i = 0; i < 4; i++)
    {
        printf("%d\n",a[i]);
    }
    return 0;
}

这样写也没任何问题,将数组array的首地址赋予了a,可以的。
这也解释了为什么在函数传参中,使用指针去接数组,当然用数组的形参去接数组,在征服C指针那本书中谈到了,是不存在,但是可以用的。

如下:

#include<stdio.h>
int p(int *array, int size);
int main(void)
{
    int array[4] = {1,2,3,4};
    int *a = array;
    p(a,4);
    return 0;
}
int p(int array[],int size)
{
    for(int i = 0; i < size; i++)
    {
        printf("%d\n",array[i] );
    }
    return 0;
}

使用的是int array[ ]接收数组型的参数。

#include<stdio.h>
int p(int *array, int size);
int main(void)
{
    int array[4] = {1,2,3,4};
    int *a = array;
    p(a,4);
    return 0;
}
int p(int *array,int size)
{
    for(int i = 0; i < size; i++)
    {
        printf("%d\n",array[i] );
    }
    return 0;
}

使用指针 int *a去接数组型的参数。

所以,只有在形参中,这二者才是等同的,事实上,都是翻译成指针的。

附录
typedef总结
typedef char *ptr_to_char;
ptr_to_char a; //这个时候a就是一个指向字符的指针了!
常量:
int const *pci; //可以修改指针的值,但是不可以修改*pci的值
int * const cpi; // 可以修改*cpi的值,但是不可以修改指针的值

版权声明:本文为博主原创文章,未经博主允许不得转载。

对String的深入理解

我们先来看一段代码:package com.ykp.test;public class StringTest { public static void main(String[] args) ...
  • ghgzczxcvxv
  • ghgzczxcvxv
  • 2016年03月12日 14:54
  • 514

谈一下我对于指针的理解

--------------------转载请注明源地址: 对于指针,我是纠结了很久,很长一段时间都没有弄懂,指针到底是个什么玩意。查了不少资料:算是对于指针有了点理解,就写下来把; 在内存中,每一个...
  • u013082522
  • u013082522
  • 2014年03月02日 00:52
  • 2051

对指针的一点点理解

指针这个东西真的有点玄乎,一不小心就会上了他的当。不过,静下心来自习研究研究,其实也并不难。 今天对指针有一点点的小理解,由于个人记忆力不好,今天理解明白是怎么回事,或许明天又可能因为 这个问题再...
  • huangyong1314
  • huangyong1314
  • 2013年04月30日 00:13
  • 597

C 指针的理解

推荐对C语言有一定理解的程序员阅读。 如何理解指针就是地址。 1. 内存长成啥样? 2. 什么是地址? 3. 为什么说指针就是地址?...
  • shijichao2
  • shijichao2
  • 2015年11月04日 23:11
  • 714

深入理解C指针学习笔记(一)

第一章 认识指针 指针在C和C++中随处可见,它给程序员带来了极大的方便,指针为动态内存的分配提供了重要支持。使用指针我们可以方便的操控内存,提高程序的运行效率;同时利用指针变量我们可以实现各种数...
  • u014630623
  • u014630623
  • 2016年03月21日 21:52
  • 662

深入理解指针之必看

一。指针的概念     指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。     要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内...
  • mdx20072419
  • mdx20072419
  • 2012年07月31日 15:40
  • 2833

C++指针的理解

我们知道,在计算机内存中可以通过变量名称作为标识符访问变量。这种方法,程序不需要关心数据在内存的物理地址;无论何时涉及变量时,它简单地使用标示符。 对于C++程序,计算机的内存就像一系列内存单元的组...
  • shenwanjiang111
  • shenwanjiang111
  • 2016年11月12日 18:41
  • 564

深入理解C++的指针和引用

每位学习过C++的程序员都知道指针其实就是地址(这样理解是不完全正确的,但也无可厚非,为了方便暂且这么理解着吧)。在C++中引用的内在表现其实也是地址,但引用和指针的外在表现是不同的。也就是说从汇编语...
  • ACMwsj
  • ACMwsj
  • 2014年05月15日 16:38
  • 479

如何理解指向指针的指针?

问题:如何理解指向指针的指针? 我在一篇教程中看到下面这段,它描述指向指针的指针是如何运作的。 引用文章相关段落如下: int i = 5, j = 6, k = 7; int *ip1 = &...
  • jb19900111
  • jb19900111
  • 2014年03月04日 11:00
  • 1355

深入理解C语言指针的奥秘-一篇很好的C指针教程

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。   要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的   类型,指针的值或者叫指针所指向的内存区,还有指针本身所占...
  • kiddy19850221
  • kiddy19850221
  • 2011年07月31日 19:45
  • 1404
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一点点指针的理解
举报原因:
原因补充:

(最多只允许输入30个字)