设为首页 加入收藏

TOP

C语言指针声明探秘 (一)
2014-11-23 22:53:45 来源: 作者: 【 】 浏览:5
Tags:语言 指针 声明 探秘

前言
我对C指针的理解一直停留在:指针本身是一块内存,它保存了一块内存的地址,可以引用,但是最近在读代码的时候,各种指针的声明搞得我异常苦恼,赶紧去学习了一番,也只是明白了最基本的使用,总结如下。

基本知识
指针的基本使用正如前言中说的,先看这样一段代码:
[cpp]
#include

int main()
{
int i = 10;
int * p;
printf("p的地址:%d\n",&p);
printf("未初始化时p的内容:%d\n",p);
// printf("未初始化访问p指向的内存:%d\n",*p); // 这行代码访问了个野指针,必然发生段错误
p = &i;
printf("--初始化p完毕--\n");
printf("p里面保存的地址:%d\n",p);
printf("p指向的内存的内容:%d\n",*p);
printf("p的大小:%d\n",sizeof(p));
printf("p指向的内存大小:%d\n",sizeof(*p));
return 0;
}

#include

int main()
{
int i = 10;
int * p;
printf("p的地址:%d\n",&p);
printf("未初始化时p的内容:%d\n",p);
// printf("未初始化访问p指向的内存:%d\n",*p); // 这行代码访问了个野指针,必然发生段错误
p = &i;
printf("--初始化p完毕--\n");
printf("p里面保存的地址:%d\n",p);
printf("p指向的内存的内容:%d\n",*p);
printf("p的大小:%d\n",sizeof(p));
printf("p指向的内存大小:%d\n",sizeof(*p));
return 0;
}

输出结果为:[plain] view plaincopyprint p的地址:1439276008
未初始化时p的内容:0
--初始化p完毕--
p里面保存的地址:1439276020
p指向的内存的内容:10
p的大小:8
p指向的内存大小:4

p的地址:1439276008
未初始化时p的内容:0
--初始化p完毕--
p里面保存的地址:1439276020
p指向的内存的内容:10
p的大小:8
p指向的内存大小:4

这就是指针的基本使用,可用下图来说明:


指针与数组
首先看这两个声明语句:
[cpp]
char (*a) [100];
char* a [100];

char (*a) [100];
char* a [100];
第一个是声明了一个指向有100个char元素的数组的指针(注意和指向数组首地址的char型指针分开);第二个是声明了一个有100个char*元素的数组,数组里面装的是char *。
为了理解,我们来看这样一段代码:
[cpp]
#include

int main()
{
int arr[10][100];
printf("sizeof(arr[0]) = %lu\n", sizeof(arr[0]));
printf("sizeof(arr[0][0]) = %lu\n", sizeof(arr[0][0]));
int *p;
int (*q)[100];
p = &arr[0][0];
q = &arr[0];
printf("p = %d\n",p);
printf("q = %d\n",q);
printf("sizeof((*p)) = %lu\n", sizeof((*p)));
printf("sizeof((*q)) = %lu\n", sizeof((*q)));
p++;
q++;
printf("after add 1, p = %d\n", p);
printf("after add 1, q = %d\n", q);
return 0;
}

#include

int main()
{
int arr[10][100];
printf("sizeof(arr[0]) = %lu\n", sizeof(arr[0]));
printf("sizeof(arr[0][0]) = %lu\n", sizeof(arr[0][0]));
int *p;
int (*q)[100];
p = &arr[0][0];
q = &arr[0];
printf("p = %d\n",p);
printf("q = %d\n",q);
printf("sizeof((*p)) = %lu\n", sizeof((*p)));
printf("sizeof((*q)) = %lu\n", sizeof((*q)));
p++;
q++;
printf("after add 1, p = %d\n", p);
printf("after add 1, q = %d\n", q);
return 0;
}
这端代码运行后结果如下:
[plain]

sizeof(arr[0]) = 400
sizeof(arr[0][0]) = 4
p = 1411443800
q = 1411443800
sizeof((*p)) = 4
sizeof((*q)) = 400
after add 1, p = 1411443804
after add 1, q = 1411444200

sizeof(arr[0]) = 400
sizeof(arr[0][0]) = 4
p = 1411443800
q = 1411443800
sizeof((*p)) = 4
sizeof((*q)) = 400
after add 1, p = 1411443804
after add 1, q = 1411444200
因为内存是线性的,C中所谓的二维数组不过是数组的数组,arr这个数组有10个元素,每个元素是一个长度为100的数组,在程序员的脑子里面,arr是一个有10行100列的二维数组。
代码里的p是一个指向int型的指针,q是一个指向“有100个int的int数组”的指针。所以p和q的初始化方式是不同的,但是开始的时候他们都指向了arr这个数组的数组的首地址(初始时是相等的),但是到后面分别执行自增操作之后,因为它们的类型不同,因此根据指针自增运算的含义,他们移动的步长也不相同,p移动了sizeof(int)个字节,而q移动了sizeof(int[100])个字节,于是它们的值也大不相同,可以用下图来说明:

\
另外要注意的就是字符二维数组的声明:
[cpp]
include

int main()
{
char* str[2] = {"liushuai","kobe"};

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇c语言实现双链表 下一篇C语言中的typedef

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: