1.指针是什么?该如何理解?
我们通常所说的指针是指针变量!
所以我们在理解指针变量时可以把他看成一个特殊的用来存放地址变量,而指针其实就是地址!(注意区分 指针变量和指针)
2.如何去得到指针?
我们可以先创建一个指针变量再运用 & 取址符去获取其他变量的地址并把它存放在该指针变量中。
( 不同类型的变量的地址要放在它对应类型的指针变量中!)
( 创建指针变量时例如 :int* ap = &a;在此处的 * 是声明该变量是该类型的指针变量,是将a的地址存放在ap中,而不是放在 *ap 中!而*ap(解引用ap,下文会讲到)是获取ap中存放地址处的值。)
int main()
{
int a = 1;
int* ap = &a;
float b = 1.1;
float* bp = &b;
double c = 1.1;
double* cp = &c;
char d = 'd';
char* d = &d;
return 0;
}
3.指针变量占用多少个字节呢?
在32位操作系统中所有的指针变量都占用4字节,同理在64位操作系统中所有指针变量都为8字节。
我们可以用(sizeof)去验证!
4.如何去运用指针?
我们可以用 “ * ”去解引用指针变量从而获取在该地址中存放的变量值。
int main ()
{
int a=1;
int* ap = &a;
printf("%d",*ap);
return 0;
}
5.指针的简单运用!
int main()
{
int a[5] = {1,2,3,4,5};
int *ap = a;
for(int i = 0 ; i<5 ; i++)
{
printf("%d",*(ap+i));
}
return 0;
}
指针ap+i,(数组名其实是地址,而素组中的首元素就是存在数组名该地址下,即:数组名是数组首元素的地址。) 我们以 ap+1举例:人为理解:数组中的第2个元素而 编译器的处理方式是:它把指针ap 的值加上了sizeof(int),在32 位程序中,是被加上了4,因为在32 位程序中,int 占4 个字节。由于地址是用字节做单位的,故ap所指向的地址由原来的变量a 的地址向高地址方向增加了4 个字节所以在第二次for循环中输出了数组中的第二个元素 2。
6.空指针与野指针。
空指针:一个指针不指向任何数据。用NULL来表示。
野指针:指针指向的位置是不可知的,随机的,不正确的或者没有限制的。
野指针的成因:
1.
int main()
{
int* pa;
*pa = 1;
return 0;
}
该例子中我们没有对pa进行初始化,而是直接进行解引用。所以 pa 就是野指针。
这条程序是错误的!
2.
但我们用指针对数组进行操作时,例如:int a[10]={1,2,3,4,5,};int* pa =a;但是我们用pa+10;进行了操作,即越界访问,此时pa也成为了野指针。
那我们该如何规避野指针的出现呢?
1.对指针进行初始化,让指针有所指向。
2.如果不知道该给指针变量赋什么值时,可以将指针设为空指针。
int main()
{
int* ap = NULL;
int a = 1;
ap = & a;
return 0;
}