形象地讲,我们可以把计算机的内存看作一条长街上的一排房屋,每个房间都可以容纳数据并通过一个房号来表识。而表示每个房间房号的值我们可以称为地址。或许这样的比喻有局限性,毕竟真实地计算机内存是以数以万计的bit位组成。
⑴初始化:
①最简单的以 int *p 为例,初始化时内存里开辟了四个字节的空间。
▇▇▇▇
②另一个声明 ,现在,我们有两个变量,下图中显示了后面那个未知内容的内存。
char ch = ‘a‘;
char cp = &a;
▇→▇▓←(?)
(cp) (ch)
⑵“*”的用法
① 定义指针变量是
② 对指针变量进行节引用是
★注意1:若要实现地址的移动,是p++,而不是*p++
★注意2:
int *p = NULL; //代表创建一个指针变量,并对它进行初始化。
*p = NULL; //将访问到的内容改为NULL。
★注意3:对于数组int a[4],&a与a的区别是什么呢?&a与a的内容一样,但&a+1增加了16个字节,而a+1增加了一个字节。原因是&a是整个数组的地址,而a是数组首元素的地址。
如下表格可以让我们深刻地理解指针与数组的区别
a[]={1,2,3,4} | char name[]="abcdef" | char *name="abcdef" |
sizeof(a)=16 | sizeof(name[0])=1 | sizeof(&name)=4 |
sizeof(&a)=16 | sizeof(&name)=4 | sizeof(*name)=1 |
sizeof(a+0)=4 | sizeof(*name)=1 | sizeof(&name+1)=4 |
=4sizeof(*a)=4 | sizeof(&name+1)=4 | sizeof(name)=4 |
sizeof(a+1)=4 | sizeof(name+1)=4 | sizeof(name+1)=4 |
sizeof(&a)=4 | sizeof(name)=7 | strlen(name)=6 |
sizeof(&a[0])=4 | strlen(&name)=6 | strlen(&name)=6 |
sizeof(&a[0]+1)=4 | strlen(&name+1)=12 | strlen(&name+1)=随机值 |
指针数组与数组指针的区别
指针数组:用于存储指针的数组,即数组元素都是指针。
数组指针:指向数组的指针。
表达式 | 类型 | 表示 | 元素表示 |
int a[4] | 整型数组 | 含有4个元素的整型数组 | a[i] |
int *a[4] | 数组指针 | a中元素为int型指针 | *a[i]或*(a[i]) |
int (*a)[4] | 数组指针 | 指向数组a的指针 | (*a)[i] |
▲int *: 一次访问四个字节.
▲char *: 一次访问一个字节.
时间: 2024-11-03 21:28:54