c 语言学习指针 - 几个概念的指针
1.指针的类型
基本数据类型比如 int、char ,还有 一些复杂的比如 int (*p)[], 指向数组的指针,像这种的判断就是指针名字去掉 , 指针的类型类型就是 int(*)[],其实就是指向数组的指针
2.指针所指向的类型
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。 你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。
例如:int*ptr:指针所指向的类型是int int(*ptr)[3]:指针所指向的的类型是int()[3]
3.指针的值
我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
看一段代码:这段代码是问你p1 是否和p2 相等?
#include "stdio.h"
int main()
{
char *p1,*p2,*p3;
char ch[] = {'a', 'b', 'c'};
char **pp;
p1 = ch;
pp = &ch;
p2 = *pp;
if (p1 == p2) {
printf("p1 == p2n");
} else {
printf("p1 != p2n");
}
printf("p3 = %p", p3);
return 0;
}
结果是:
//p1 != p2
//p3 = 0x4005f0dxy
&ch 指针类型为 char (*)[3], 当运行到pp=&ch 时候,编译器会骂你 “warning: assignment from incompatible pointer type” 指针类型不匹配(在vc6下直接报错)。看一下p3 会有一个值,未初始化指针是有内存地址的,而且是一个垃圾地址。不知道这个内存地址指向的值是什么。这就是为什么不要对未初始化指针取值的原因。最好的情况是你取到的是垃圾地址接下来你需要对程序进行调试,最坏的情况则会导致程序崩溃。以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里?
还有一个题目可以试试
#include "stdio.h"
int main()
{
int a[5] = {1,2,3,4,5};
int *p = (int *)(&a+1);
printf("%d,%d", *(a+1), *(p-1));
}
答案在此
上一篇: C 标准库 IO 使用说明
下一篇: c语言学习详解
推荐阅读
-
c 语言学习指针 - 几个概念的指针
-
C 语言真的很难?那是因为你没有读懂这张图,所以无法轻松学习 C 语言。-VIII.指针指针
-
C 语言中的指针和指针变量
-
面试问题 008:解释 C 语言中的函数指针并举例说明?
-
深入了解 C 语言函数参数传递系列中的那些内容(函数参数、指针、地址、数组)
-
C 语言基本介绍和函数指针的使用(包含简单的四则运算计算器)
-
C 语言学习之旅 - 指针函数、函数指针、数值指针、指针值、结构变量、指针变量与结构变量的区别
-
函数指针的 C 语言实现、面向对象的编程方法
-
C 函数指针和指针函数的区别 - C 语言零基础教程
-
C 语言学习 VI - 函数指针、回调函数、字符串和结构体