指针与数组
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个字节。
相关文章推荐
- 关于指针的一些事情
- C# Pointer指针应用实例简述
- C和指针小结(推荐)
- C++智能指针实例详解
- 浅谈C++指针(必看)
- C++指向函数的指针实例解析
- 关于c语言指针的两处小tip分享
- 浅谈c/c++中使用指针需要注意的问题
- 浅析iterator与指针的区别
- 探讨C++中数组名与指针的用法比较分析
- C++编程指向成员的指针以及this指针的基本使用指南
- 详解C++中的指针、数组指针与函数指针
- C++中字符串以及数组和指针的互相使用讲解
- C语言安全之数组长度与指针实例解析
- C++中指向对象的常指针与指向常对象的指针详解
- 指向变量的常指针与指向常变量的指针详细解析
- C#通过指针实现快速拷贝的方法
- 深入理解c++指针的指针和指针的引用
- php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
- C#通过指针读取文件的方法