还是看源码发现的问题
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格式的。
这是网易笔试的一道题,问他的输出是多少。考察的就是对指向数组的指针的认识:
int main()
{int arr[] = {1,2,3,4,5,6,7};int *p = arr;*(p++) += 89;printf("%d,%d\n", *p,*(++p));return 0;
}
*p是指向数组首地址的指针。这里要说的是数组名是数组首元素的首地址,同时也是一个指针常量,存放数组首地址。二者数值上相同,操作不同。数组名作指针常量处理时不能作左值,不能自加自减。在作函数形参的时候沦为普通指针。
这里把arr赋值给*p,通过指针访问数组元素,其实数组下标的访问方式就是通过指针实现的。所以关键就在于p的取值,即地址是第几个元素的地址。
*(p++)+=89
*(p++)=*(p++)+89//两个++都是在p之后,所以在这一行中p的值没有影响,所以p还是指向第一个元素,只不过第一个元素被修改为90
按道理继续格式化输出的p已经加了一次,应该指向第二个,第三个元素。但是程序输出不是这样
#include<stdio.h>
#include<string>
int main()
{int arr[] = { 1, 2, 3, 4, 5, 6, 7 };int *p = arr;*(p++) += 89;printf("\*p的值%d\n", *p);printf("\*p的值%d,\*(p++)的值%d\n", *p, *(++p));getchar();return 0;
}
若是直接在修改第一个元素之后输出*p,是第二个元素的值,如果连同*(p++)一起输出,先计算p++,再输出,这时候p指向了第三个元素。