char cp; / 定义一个指针变量cp,指向字符型变量 */
float * fp; /* 定义一个指针变量fp,指向实型变量 */
double *dp1, dp2; / 定义两个指针变量dp1和dp2,指向双精度实型变量 */
定义多个指针变量时,每个指针变量前面都必须加上*
指针变量的类型不是指指针变量本身的类型,而是指定它所指向的变量的数据类型。
定义指针及指针赋值
int i, *p;
p = &i;
p = 0;
p = NULL;
p = (int *) 100;
p = &i;语句中的指针p被看作是指向变量 i 或存放变量 i 的地址,也就是将指针p和变量 i 关联起来,这也是指针最常用的赋值方法。指针变量p和整型变量 i 之间的关系如下:
p = 0;和p = NULL;语句说明了怎样把特殊值0赋值给指针p,这时指针的值为NULL。常量NULL在系统文件stdio.h中被定义,其值为0,将他赋给指针时代表空指针。
p = (int *) 100;使用强制类型转换(int *)来避免编译错误,表示P指向地址为100的int类型变量。不建议这样使用,一般不将绝对地址赋值给指针,NULL例外。
在定义指针变量时,要注意以下几点。
-
指针变量名是一个标识符,要按照C标识符的命名规则对指针变量进行命名。
-
指针变量的数据类型是它所指向的变量的类型,一般情况下一旦指针变量的类型被确定后,他只能指向同种类型的变量。
-
在定义指针变量时需要使用指针声明符 * ,但指针声明符并不是指针的组成部分。例如:定义int *p;说明p是指针变量,而不是*p;
[](
)指针的基本运算
如果指针的值是某个变量的地址,通过指针就能间接访问那个变量,这些操作由取地址运算符&和间接访问运算符 * 完成。此外,相同类型的指针还能进行赋值、比较和算术运算。
1、取地址运算和间接访问运算
单目运算符 & 用于给出变量的地址。例如:
int *p, a = 3;
p = &a;
将整型变量a的地址赋给整型指针p,使指针p指向变量a。也就是说,用运算符&取变量a的地址,并将这个地址值作为指针p的值,使指针p指向变量a。
指针的类型和它所指向变量的类型必须相同。
在程序中,“ * ” 除了被用于定义指针变量外,还被用于访问指针所指向的变量,它也称为间接访问运算符。例如:但p指向a时,*p和a访问同一个存储单元,*p的值就是a的值,如下图:
取地址运算和间接访问运算示例。
#include<stdio.h>
int main(){
int a = 3, p; / 定义整型变量a和整型指针p */
p = &a; /* 把变量a的地址赋给指针 需要zi料+ 绿色徽【vip1024b】
p,即p指向a */
printf(“a = %d, *p = %d\n”, a, p); / 输出变量a的值和指针p说指向变量的值 */
p = 10; / 对指针p所指向的变量赋值,相当于对变量a赋值 */
printf(“a = %d, *p = %d\n”, a, *p);
printf(“请输入a的值:”);
scanf(“%d”, &a); /* 输入a */
printf(“a = %d, *p = %d\n”, a, *p);
(p)++; / 将指针所指向的变量加1 */
printf(“a = %d, *p = %d\n”, a, *p);
return 0;
}
运行结果:
表达式*p = *p + 1、++_p和(_p)++,都是将指针p所指向变量的值加1。而表达式_p++等价于*(p++),先取_p的值作为表达式的值,在将指针p的值加1,运算后,p不再指向变量a。如:
int a = 1, x, *p;
p = &a;
x = *p++;
总结
虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。
架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。
如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。
如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
[外链图片转存中…(img-F5EqWxpQ-1710346131081)]