C语言重点笔记五(上)——指针(指针赋值)
指针在C语言基础中非常重要,对后面学习C++或数据结构算法都有很大作用。
这是前面一部分哦!如果对大家有帮助的话,能否送个赞鼓励一下哇!!!
基础知识笔记一:
1.指针概念:一种特殊的数据类型,用来表示内存地址。
指针就是内存地址,指针变量就是存储内存地址的变量。
2.声明指针变量:
指针必须先声明后使用。指针变量名前必须放置指针运算符“*”
数据类型 *指针变量名
eg. int *p; 指针p的基类型是int。
int* p; int * p;三种写法都是一样的。
声明多个同类型指针变量,每个指针变量都要加上指针运算符“*”
eg. int *p1,*p2;
3.空指针NULL用来表示指针不指向任何变量:
eg. int *p=NULL;
表示指针不指向任何整型变量,NULL可以赋值给任何类型的指针
4.(1)指针不能赋予整数
(2)指针不能赋予整型变量的值
(3)指针浮点型变量的指针不能指向整型变量
(4)不同类型的指针之间不能相互赋值
eg.以下写法都是错误的:
int x,y,*p1,*p2;
double *d;
(1)p1=100;
(2)p2=y;
(3)d=&x;
(4)d=p1;
5.int *p=&x;
指针p指向变量x,*p就是变量x的别名,*p和x拥有相同的值,改变*p也就改变了x的值,反之亦然。
6.“&”和“*”互为逆运算 x等价于*&x
基础知识笔记二:
1.指向指针的指针:数据类型 **指针变量名
指针运算符*是右结合的,"*指针变量名"表示的是一个指针变量,"**指针变量名"表示该指针变量指向另一个指针变量
eg. int x=88;
int *p=&x
int **pp=&p;
声明了整型变量x,然后声明了指针变量p指向变量x,也就是p的值指向变量x的内存地址;
最后声明了指针变量pp指向指针变量p,也就是pp的值是指针变量p的内存地址,pp是指向指针的指针。
2.通用指针:void
不同类型的指针变量之间不能直接赋值,必须使用强制类型上转换。
eg. int *pInt;
double *pDouble;
...
pInt=pDouble;错误!!!
pInt=(int *)pDouble;正确
3.使用const修饰指针:由const的位置决定谁为常量。
(1)const在指针运算符“*”的左边:
eg. int x=126,y=163;
const int *pInt=&x;
或者 int const *pInt=&x;
不能通过指针pInt来修改x的值,但可以修改指针pInt本身的值,使其指向其他变量。
*pInt=88;错误
pInt=&y;正确
(2)const在指针运算符“*”的右边:
eg. int *const pInt = &x;
pInt所指向的变量的值是可以修改的,能够通过指针pInt来修改变量x的值,但指针pInt本身的值是常量,不能使其指向其他变量
*pInt=88;正确
pInt=&y;错误
(3)const在指针左右边
eg. const int *const pInt = &x;
既修饰指针所指向的变量也修饰指针本身,两处都不能修改
*pInt=88;错误
pInt=&y;错误
下面用代码来帮助大家进一步理解指针的使用:
1.演示指针变量:
#include <stdio.h>
int main(){
int x=88;
int *p=&x;
printf("变量x的值(x):%dn",x);
printf("变量x的内存地址(&x):%#pn",&x);
printf("指针变量p的值(p):%#pn",p);
printf("指针变量p指向的内存空间中所存放的值(*p):%dn",*p);
printf("变量x的值(*&x):%dn",*&x);
return 0;
}
不同的计算机运行上面的程序内存地址可能不同。
刚开始学习指针的同学可能会感到混乱,根据上面的输出结果,可以清晰地比较x,&x,p,*p,*&x的含义,加深理解。
指向指针的指针:指针可以指向基本数据类型的变量,也可以指向指针变量。当指针指向指针变量时,称为指向指针的指针,也称为多级指针。(上面笔记二第一点有提到相关要点)
2.演示指向指针的指针:
/*eg.指向指针的指针*/
#include <stdio.h>
int main(){
int x=88;
int *p=&x;
int **pp=&p;
printf("变量x的值(x):%dn",x);
printf("变量x的内存地址(&x):%#pn",&x);
printf("指针变量p的值(p):%#pn",p);
printf("指针变量p指向的内存空间中所存放的值(*p):%dn",p);
printf("变量指针p的内存地址(&p):%#pn",&p);
printf("指针变量pp的值(pp):%#pn",*pp);
printf("指针变量pp指向的储存单元中所存放的值(*pp):%#pn",*pp);
printf("变量x的值(**pp):%dn",**pp);
return 0;
}
// %#p说明:p表示按十六进制格式输出指针(内存地址),#表示带有前缀OX
在不同的计算机、操作系统和编译器上运行上面的程序,输出的内存地址可能不同。
程序第4行声明了整型变量x,其初始值为88。
程序第5行声明了指针变量p,其初始值为变量x的内存地址,这样指针变量p指向变量x。
程序第6行声明了指针变量pp,其初始值为指针变量p的内存地址,这样指针变量pp指向指针变量p。
程序第7行输出变量x中存放的值88。
程序第8行输出变量x的内存地址。
程序第9行输出指针变量p中存放的值,也就是变量x的内存地址,所以p与&x的值是相同的。
程序第10行输出指针变量p指向的内存空间所存放的值,也就是变量x中存放的值、所以*p与x的值是相同的。
程序第11行输出指针变量p的内存地址。
程序第12行输出指针变量pp中存放的值,也就是指针变量(p的内存地址所以pp与&p的值是相同的。
程序第13行输出指针变量pp指向的内存空间所存放的值,也就是指针变量p中存放的值,所以*pp与p的值是相同的。
程序第14行输出变量x中存放的值,所以**p与x的值是相同的。
3.演示指针赋值和值赋值:
/*eg.演示指针赋值和值赋值*/
#include <stdio.h>
int main(){
int x,y;
int *p1,*p2;
x=-42;
y=163;
p1=&x;
p2=&y;
printf("x=%d,*p1=%dn",x,*p1);
printf("y=%d,*p2=%dn",y,*p2);
*p1=*p2;
printf("x=%d,*p1=%dn",x,*p1);
printf("y=%d,*p2=%dn",y,*p2);
*p2=126;
p1=p2;
printf("x=%d,*p1=%dn",x,*p1);
printf("y=%d,*p2=%dn",y,*p2);
return 0;
}
理解好上面的指针赋值 ,对指针的理解会有很大帮助。
程序第4行声明了整型变量x和y。
程序第5行声明了整型指针pl和p2。
程序第6、7行分别置x和y的初始值为-42和163;
程序第8、9行分别置pl和p2的初始值为x和y的内存地址(&x和&y),这样指针p1指向变量x,指针p2指向变量y。
程序第10行输出变量x的值和指针pl所指向的变量的值,它们应该是一样的。
程序第11行输出变量y的值和指针p2所指向的变量的值,它们也应该是一样的。
程序第12行是值赋值,把指针p2所指向的变量的值,也就是变量y的值163,赋值给指针p1所指向的变量中,也就是x中,这样x、y中的值以及指针p1、p2所指向的变量的值都为163,这可以从第13、14行的输出结果得到验证。
程序第15行将指针p2所指向的变量的值,也就是变量y的值修改为126,现在x的值为163,y的值为126。
程序第16行是指针赋值,指针p1、p2都指向同一个变量y,这样p1、p2所指向的变量的值都为126,也就是变量y的值,而变量x中存放的值仍为163,这可以从第17、18行的输出结果得到验证。
指针笔记(下)加快更新......
希望对大家有帮助!