C指针 取地址符& 取值符* 您所在的位置:网站首页 如何获取指针的值数组 C指针 取地址符& 取值符*

C指针 取地址符& 取值符*

2024-07-17 07:10| 来源: 网络整理| 查看: 265

int *MFSS_Pointer; #define   FPGA_ADDR 0x0a0000000//CE2 MFSS_Pointer = (int*)(FPGA_ADDR+4*i); *MFSS_Pointer = (data_q int* a; *a = 10; }

像这样的代码是十分危险的。因为指针a到底指向哪里,我们不知道。就和访问未初始化的普通变量一样,会返回一个「随机值」。但是如果是在指针里面,那么就有可能覆盖到「其他的内存区域」,甚至可能是系统正在使用的「关键区域」,十分危险。不过这种情况,系统一般会驳回程序的运行,此时程序会被「中止」并「报错」。要是万一中奖的话,覆盖到一个合法的地址,那么接下来的赋值就会导致一些有用的数据被「莫名其妙地修改」,这样的bug是十分不好排查的,因此使用指针的时候一定要注意初始化。

4,scanf中取地址符号的使用 int main(void) { int a; int* p = &a; printf("请输入一个整数:"); scanf("%d", &a);//此处需要& printf("a = %d\n", a); printf("请再输入一个整数:"); scanf("%d", p);//此处不需要& printf("a = %d\n", a); return 0; }

程序运行如下:

//Consequence 02 请输入一个整数:1 a = 1 请再输入一个整数:2 a = 2 字符串地址 //Example 03 #include int main(void) { char url[100]; url[99] = '\0'; printf("请输入TechZone的域名:"); scanf("%s", url);//此处也不用& printf("你输入的域名是:%s\n", url); return 0; }

程序执行如下:

//Consequence 03 请输入TechZone的域名:www.techzone.ltd 你输入的域名是:www.techzone.ltd

数组名其实就是一个「地址信息」,实际上就是数组「第一个元素的地址」

//Example 03 V2 #include int main(void) { char url[100]; printf("请输入TechZone的域名:"); url[99] = '\0'; scanf("%s", url); printf("你输入的域名是:%s\n", url); printf("url的地址为:%p\n", url); printf("url[0]的地址为:%p\n", &url[0]); if (url == &url[0]) { printf("两者一致!"); } else { printf("两者不一致!"); } return 0; }

程序运行结果为:

//Comsequense 03 V2 请输入TechZone的域名:www.techzone.ltd 你输入的域名是:www.techzone.ltd url的地址为:0063F804 url[0]的地址为:0063F804 两者一致!

%p是打印地址的

5.指向数组的指针

刚刚我们验证了数组的地址就是数组第一个元素的地址。那么指向数组的指针自然也就有两种定义的方法:

... char* p; //方法1 p = a; //方法2 p = &a[0]; 6.指针的运算

当指针指向数组元素的时候,可以对指针变量进行「加减」运算,+n表示指向p指针所指向的元素的「下n个元素」,-n表示指向p指针所指向的元素的「上n个元素」。并不是将地址加1。

如:

//Example 04 #include int main(void) { int a[] = { 1,2,3,4,5 }; int* p = a; printf("*p = %d, *(p+1) = %d, *(p+2) = %d\n", *p, *(p + 1), *(p + 2)); printf("*p -> %p, *(p+1) -> %p, *(p+2) -> %p\n", p, p + 1, p + 2); return 0; }

执行结果如下:

//Consequence 04 *p = 1, *(p+1) = 2, *(p+2) = 3 *p -> 00AFF838, *(p+1) -> 00AFF83C, *(p+2) -> 00AFF840

其实使用指针法来访问数组的元素,不一定需要定义一个指向数组的单独的指针变量,因为数组名自身就是指向数组「第一个元素」的指针,因此指针法可以直接作用于数组名:

... printf("p -> %p, p+1 -> %p, p+2 -> %p\n", a, a+1, a+2); printf("a = %d, a+1 = %d, a+2 = %d", *a, *(a+1), *(a+2)); ...

执行结果如下:

p -> 00AFF838, p+1 -> 00AFF83C, p+2 -> 00AFF840 b = 1, b+1 = 2, b+2 = 3

来源:http://www.techzone.ltd/post/CPointer/



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有