1、练习定义指针
#include <stdio.h>
int main (void)
{
int *p; //定义了一个可以执行的int类型地址的指针变量,名字叫p
int a; //定义了一个int型的变量,名字叫a
a = 1;
p= &a; // 把a的内存地址赋值给P
printf("%p\n",p);
return 0;
}
输出结果:
p的值为内存地址。
2、避免不同类型的指针同时使用
#include <stdio.h>
int main (void)
{
int *p; //定义了一个可以执行的int类型地址的指针变量,名字叫p
int a; //定义了一个int型的变量,名字叫a
a = 1;
p = &a; // 把a的内存地址赋值给P
printf("%p\n",p);
*p = 10; // 通过指针变量间接地访问a的值,*p代表指针指向变量的值,p代表指向变量的地址
printf("a =%d\n",a);
a = 100 ;
printf("%d\n",*p);
int b = 2;
p = &b;
*p = 20;
printf("b = %d\n",b);
char *p1 =(char *) &a; //两个类型不同的地址 (强制转换)
// 指针类型不兼容的时候会出问题,所以应该避免不同类型的指针同时使用
*p1 = 0;
printf("a = %d\n",a);
void *p2 ; //void代表无类型,可以指向任何类型的地址
return 0;
}
输出结果:
这是我在vscode下面的输出结果,如果是其他编译器,最后a的值输出结果可能会不同。
3、指针占用内存说明
#include <stdio.h>
int main (void)
{
char *p1;
int *p2;
long long *p3;
printf("%1u,%1u,%1u\n",sizeof(p1),sizeof(p2),sizeof(p3));
int a = 0;
p2 = &a;
*p2=10;
int *p21;
p21 = &a; //*p21是什么?不管是*p2,还是*p21都代表变量a的值,但p2和p21确实是两个不同的指针变量
return 0;
}
输出结果:
关于上述结果:在32位系统下输出为4,在64位系统下输出为8.
地址编号在32位系统下,是一个4个字节的无符号整数,在64位系统下是一个8个字节的无符号整数。
在同一个系统下,不管指向什么样类型的变量,地址的大小总是一样的。
4、野指针
#include <stdio.h>
int main (void)
{
int *p;//没有初始化过值的指针,叫野指针
*p = 100;
return 0;
}
5、空指针
#include <stdio.h>
int main (void)
{
int *p;
p = NULL; //如果一个指针变量没有明确地指向一块内存,那么就把这个变量指向NULL
// 这个指针就是空指针,空指针是合法的
return 0;
}
#define NULL 0
NULL在c语言里面是一个宏常量,值是0