总结:A:左值就是能放在等号左边能赋值的值,B:指针变量是左值,是因为它是变量,而不是因为它似指针,C:通过强制转换的方式,把地址转换成指针,D:void 指针和空指针,空指针就判定一下是否指向一地址
1:指针的概念和拓展
void main200()
{
int a = 5;//能放在赋值号左边赋值的值叫左值
int *p = &a;//p是一左值,因为p是一指针变量,重要的是它是变量,而不是指针,
int *const px;//px是一指针常量,不可以被赋值
*p = 3;//指针变量,以及指针指向的数据,除非是常量,能被赋值都是左值
}
2:指针与整数,指针的地址和整数有什么关系呢?
//如何通过scanf对这个指针初始化,并且对这个指针改变这个数据呢?
void main201()
{
int a = 10;
int b = 20;
printf("%p,%p\n",&a,&b);
//我们传入了b的地址,改变了它的值,它是一个整数,那怎么通过整数的方式对它实行初始化呢?
int *p;
int x;//p是一指针,x仅仅是一地址所代表的整数,
scanf("%d", &x);//输入一个16进制的整数
p = (int *)x;//对p进行赋值,要强制转换,将地址转换为指针,需要类型的转换,直接输入一个整数,把这个整数赋值给一个指针,然后通过一个指针改变一个变量,
//scanf("\n%p",&p);//用键盘输入初始化指针变量
*p = 3;
printf("\na=%d,b=%d\n",a,b);
//那怎么通过整数的方式对它实行初始化呢?下面
system("pause");
}
3:void指针与空指针
//void 类型的指针可以传递地址比如下面的
void *p1 = p2;
p1 = p3;
//void 类型的指针,由于指向不明确,大小不确定,所以无法取出内容,
printf("%d", *p1);
//转换就可以了
printf("%d", *((int *)p1));//空指针加上类型在取出内容
要把它用于某种类型的指针,需要强制转换
void main203()
{
//void 不指向任何一个明确类型,只有一个地址,仅仅知道你从哪里开始,不知道从哪里结束呢?这个时候就没有办法取出里面的内容
//用空指针可以接收任何指针类型的地址,void类型指针主要起到一个地址传递的作用,
int a = 10;
double b = 20.8;
int *p2 = &a;
double *p3 = &b;
void *p1 = p2;
p1 = p3;
printf("%d",*p1);//错误。因为//void 不指向任何一个明确类型,只有一个地址,仅仅知道你从哪里开始,不知道从哪里结束呢?这个时候就没有办法取出里面的内容
system("pause");
}
分配内存 malloc
malloc();大家想想它的返回值是什么呢?它的返回值是一空指针,为什么返回值是一空指针?
因为它在这里就起到一传递地址的作用,我们可以把它转换成任何类型的指针,
传递地址 malloc()
4:空指针
//一个指针为空意味这什么?
判断指针是否指向一个地址,为空就不指向任何地址
void main204()
{
int *p = NULL;//没有初始化
int num = 20;
p = #//有对象了
if (p==NULL)
{
printf("指针没有初始化,是单身,可以追求");
}
system("pause");
}