指针%p输出的一些认识

还是看源码发现的问题

static int import_lowe_features( char*filename, struct feature** features )

这个函数的作用是将txt文件中的Lowe的特征点导入到feature结构体中。在这个函数中第二个参数是指向结构体的指针的指针。

f = calloc( n, sizeof(struct feature) );//在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针。再加一个for循环就实现了将txt文件中的n个特征点导入。最后*features = f;又将首地址赋给features,注意到这里的features是复数,指一幅图像中所有特征点的集合,但不明白为什么要再加一层指针。对指针的理解不够,这里应该就是导入特征点进行匹配时出错的原因。

https://blog.csdn.net/qq_14936041/article/details/53139047

#include <stdio.h>

#include<stdlib.h>

int main(void)

{

         inta;

         //printf("%p",a);

         a= 10;

         printf("%d\n%p\n",a, a);

         int*p;

         p= &a;

         printf("%d\n%d\n%p\n",p,*p, p);

         getchar();

         return1;

}

注释掉的//printf("%p", a);是为了输出初始化前变量a的地址,但c++中已经不允许这么做,会报错errorC4700: 使用了未初始化的局部变量“a”。初始化的过程才会给变量自动分配地址。

这是输出结果。这里用了变量名和指针的方式访问a,可以看到,输出的a的值都是一样的,但是a的地址和p的值及p的地址是不同的。指针变量也是一个变量,初始化的过程会赋值一个新的地址,这个地址当然和a的地址不一样,但是p的值不就应该是a的地址吗,为什么和之前输出的不一样呢?

简单修改一下代码,因为其实一直没有关注&a这个值。

int a;

         //printf("%p",a);

         a = 10;

         printf("a的值:%d\n",a);

         printf("a的地址:%p\n",a);

         printf("a的地址&a=%d\n",&a);

         printf("-------------\t\t\t\t\t\t\n");

         int*p;

         p = &a;

         printf("取p中的内容*p=%d\n",*p);

         printf("取p中的值p=%d\n",p);

         printf("取p中的地址:%p\n",p);

         printf("取p中地址&p=%d\n",&p);

         //printf("%d\n%d\n%p\n%d\n",p,*p, p,&p);

         getchar();

发现&a的值,即a的地址值确实等于p的值,但是为什么用%p打印出的a的地址和&a的值不一样呢?而且用%p打印出的p的地址也发生了变换。地址的变化可以理解,是因为动态分配内存。

原来是打印地址时,虽然使用了%p指针格式控制符,但是要想输出地址,还是要输出的是%a,而不能是a。指针格式%p意味着输出的是十六进制的数而已,这个数是指针指向数据的地址,所以%p格式输出的指针p就是%d格式输出的&a。其实a不是指针,按道理应该是不能输出%p格式的。



猜你喜欢

转载自blog.csdn.net/zcg1942/article/details/80223113