您的位置:首页 > 其它

指针与数组

2016-06-19 21:46 323 查看

 指针与数组

                                                                                                                     黑色印记
    1.指针是什么?
    在回答这个问题时,我们应该回答指针是变量。那么我们就知道指针有变量的三个属性。1.系统为指针分配内存空间。2.指针有自己的地址。3.指针能够存值,但这个值比较特殊——地址。因此,我们可以说指针是一个存放数据地址的变量。

    2.指针指向的内存空间和指针对应的内存空间之间的区别?
    根据第一个问题,我们知道指针是一个存放数据地址的变量。比如说,我定义了 int  a = 3;那么a的地址如果是0xFFFFFFFA(32位系统),我们就知道0xFFFFFFFA地址里面存放的数据是3。再定义一个整型指针  int * p = &a。那么p变量里面保存的值就是0xFFFFFFFA。但是p本身也有地址,那我们就不知道了,因为是系统随机分配的。因此p对应的内存空间内容就是oxFFFFFFFA,*p指向的内存空间内容就是3。
    举个例子来说。p++和(*p)++的区别。因为我们知道p表示对应的内存空间。并且p为整型。所以p++的值就是0XFFFFFFFE。*p表示对应空间的值,所以(*p)++的值就是4。

    3.什么是野指针?如何避免野指针?
    关于这个问题,在其他部分有着详细分析。可通过以下链接点击打开链接

    4.字符串的实质是什么?
    字符串的实质就是一个指针常量,它返回的是字符串首字符的地址。注意,这里有两个意思,一个是指针,一个是常量。指针表示它实际上是一个地址,常量表示它是不可以修改的。
include <stdio.h>
int main()
{
char *p = "hello world";
printf("%s\n",p);
p++;
printf("%s\n",p);
*p = ‘a’;
return 0;
}
 
  由上诉的解释,我们可以知道,该程序先输出hello world ,当p++之后,输出ello world。但是由于字符串是指针常量,表达式*p = ‘a’; 尝试改变字符串的值,所以会出现段错误。

    5.一维,二维,三维数组名的含义?
     我在其它文章中写了关于解析数组名的内容。可以通过以下链接点击打开链接

    6.指针数组的定义及初始化?(指针数组 VS 二维数组)
    指针数组是一个元素是指针的数组。
char *p[3] = {"abc","def"};     // sizeof(p) = 3 * 4 = 12
    指针数组除了数组元素是指针外,和一般的数组没有什么区别。但它的元素是指针,所以无论是什么类型,元素都是占4个字节。
    我个人觉得指针数组和二维数组的区别在以下几点:
    1.对于指针数组而言,元素都占4个字节。比如char *p[5]  ;  sizeof(p) = 5 * 4 = 20。
而二维数组则不一样,比如,char p[100][5]; sizeof(p) = 100 * 5 * 1 = 500。
    2.指针数组用起来比二维数组更加有效,简洁。

    7.数组和指针的区别?
    我觉得有以下几点区别。
    第一,修改内容的不同。
(1)  char p[] = "hello";                 (2)  char *p = "hello";
p[0] = ‘H’;                              *p = "H";
  printf("%s\n",p);                  printf("%s\n",p);
    第一种情况输出结果是Hello,正确的。但是第二种情况是指针常量,保存在静态数据区,不可以改变。故运行时会出现错误。
    第二,内容的复制与比较。
    对于数组,我们不能用=或==进行比较。比如(1),在定义一个数组q。我们不能使用q=p,或q==p这样的表达式。必须用strcpy或strcmp等函数。
    第三,计算内存容量。
    对于(1)我们进行sizeof(p) = 6;但是对于(2)sizeof(p)= 4。因为(2)中p是指针变量,p保存的是地址,所以必然是4个字节。

    
     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  指针