学点 C 语言(20): 数据类型 - 指针
通过 &变量 可以获取变量地址:
include <stdio.h>
int main(void)
{
int num = 10;
printf("变量值: %d\n", num);
printf("变量址: %d\n", &num);
getchar();
return 0;
}
表示变量地址的变量就是指针:
include <stdio.h>
int main(void)
{
int num = 10;
int *p = #
printf("%d, %p\n", num, p);
getchar();
return 0;
}
*指针 就如同变量本身是一样的:
include <stdio.h>
int main(void)
{
int num = 10;
int *p = #
printf("%d, %p, %d\n", num, p, *p);
*p = 11;
printf("%d, %p, %d\n", num, p, *p);
(*p)++;
printf("%d, %p, %d\n", num, p, *p);
num = 99;
printf("%d, %p, %d\n", num, p, *p);
getchar();
return 0;
}
声明指针时要注意初始化, 没有初始化的指针是危险的:
include <stdio.h>
int main(void)
{
int n1 = 11;
int n2 = 22;
int *p = NULL; /* 初始化为空 */
p = &n1;
printf("%d, %p, %d\n", n1, p, *p);
p = &n2;
printf("%d, %p, %d\n", n2, p, *p);
getchar();
return 0;
}
为什么没有初始化的指针是危险的:
include <stdio.h>
int main(void)
{
int *p;
// 上面的指针 p 没有初始化话, 但它也有个垃圾地址
printf("%p\n", p);
// 此时如果给它赋值, 谁知道会覆盖了什么?
//*p = 100; /* 不要执行这个 */
getchar();
return 0;
}
指向常量的指针: 不能通过指针修改它指向的值, 但该值可以通过其变量修改
include <stdio.h>
int main(void)
{
int n1 = 111;
int n2 = 222;
const int *p = &n1; /* 注意 const 的使用 */
printf("%d, %p, %d\n", n1, p, *p);
n1 = 333;
//*p = 333; /* 不可以这样, 因为现在的指针是常量 */
printf("%d, %p, %d\n", n1, p, *p);
p = &n2; /* 可以改变指针的指向 */
printf("%d, %p, %d\n", n2, p, *p);
getchar();
return 0;
}
常量指针: 锁定指针的指向
include <stdio.h>
int main(void)
{
int n1 = 111;
int n2 = 222;
int *const p = &n1; /* 注意 const 的使用 */
printf("%d, %p, %d\n", n1, p, *p);
n1 = 333;
//*p = 333; /* 不可以这样, 因为现在的指针是常量 */
printf("%d, %p, %d\n", n1, p, *p);
// p = &n2; / 现在不可以改变指针的指向了 /
// printf("%d, %p, %d\n", n2, p, *p);
getchar();
return 0;
}
指针是有类型的:
include <stdio.h>
int main(void)
{
long n = 100L;
float f = 1.5f;
double d = 3.14159265;
long *p1 = &n;
float *p2 = &f;
double *p3 = &d;
printf("%ld\n", *p1);
printf("%g\n", *p2);
printf("%.8f\n",*p3);
getchar();
return 0;
}
- 令人迷惑的指针定义:
到底应该怎样写:
int *p;
int * p;
int* p;
因为 C 语言忽略空白, 这些都是对的, 但下面的例子会说明哪个更好:
include <stdio.h>
int main(void)
{
int n1, n2, *p; /* 定义了两个整数(n1、n2), 和一个整数指针(p) */
n1 = 111;
n2 = 222;
p = &n1;
printf("%d, %p\n", *p, p);
p = &n2;
printf("%d, %p\n", *p, p);
getchar();
return 0;
}
如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!
txttool.com 说一段 esp56物联 查询128 IP查询