指针%p输出的一些认识
還是看源碼發(fā)現(xiàn)的問題
static int import_lowe_features( char*filename, struct feature** features )
這個(gè)函數(shù)的作用是將txt文件中的Lowe的特征點(diǎn)導(dǎo)入到feature結(jié)構(gòu)體中。在這個(gè)函數(shù)中第二個(gè)參數(shù)是指向結(jié)構(gòu)體的指針的指針。
f = calloc( n, sizeof(struct feature) );//在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配n個(gè)長(zhǎng)度為size的連續(xù)空間,函數(shù)返回一個(gè)指向分配起始地址的指針。再加一個(gè)for循環(huán)就實(shí)現(xiàn)了將txt文件中的n個(gè)特征點(diǎn)導(dǎo)入。最后*features = f;又將首地址賦給features,注意到這里的features是復(fù)數(shù),指一幅圖像中所有特征點(diǎn)的集合,但不明白為什么要再加一層指針。對(duì)指針的理解不夠,這里應(yīng)該就是導(dǎo)入特征點(diǎn)進(jìn)行匹配時(shí)出錯(cuò)的原因。
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++中已經(jīng)不允許這么做,會(huì)報(bào)錯(cuò)errorC4700: 使用了未初始化的局部變量“a”。初始化的過(guò)程才會(huì)給變量自動(dòng)分配地址。
這是輸出結(jié)果。這里用了變量名和指針的方式訪問a,可以看到,輸出的a的值都是一樣的,但是a的地址和p的值及p的地址是不同的。指針變量也是一個(gè)變量,初始化的過(guò)程會(huì)賦值一個(gè)新的地址,這個(gè)地址當(dāng)然和a的地址不一樣,但是p的值不就應(yīng)該是a的地址嗎,為什么和之前輸出的不一樣呢?
簡(jiǎn)單修改一下代碼,因?yàn)槠鋵?shí)一直沒有關(guān)注&a這個(gè)值。
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中的內(nèi)容*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();
發(fā)現(xiàn)&a的值,即a的地址值確實(shí)等于p的值,但是為什么用%p打印出的a的地址和&a的值不一樣呢?而且用%p打印出的p的地址也發(fā)生了變換。地址的變化可以理解,是因?yàn)閯?dòng)態(tài)分配內(nèi)存。
原來(lái)是打印地址時(shí),雖然使用了%p指針格式控制符,但是要想輸出地址,還是要輸出的是%a,而不能是a。指針格式%p意味著輸出的是十六進(jìn)制的數(shù)而已,這個(gè)數(shù)是指針指向數(shù)據(jù)的地址,所以%p格式輸出的指針p就是%d格式輸出的&a。其實(shí)a不是指針,按道理應(yīng)該是不能輸出%p格式的。
這是網(wǎng)易筆試的一道題,問他的輸出是多少。考察的就是對(duì)指向數(shù)組的指針的認(rèn)識(shí):
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是指向數(shù)組首地址的指針。這里要說(shuō)的是數(shù)組名是數(shù)組首元素的首地址,同時(shí)也是一個(gè)指針常量,存放數(shù)組首地址。二者數(shù)值上相同,操作不同。數(shù)組名作指針常量處理時(shí)不能作左值,不能自加自減。在作函數(shù)形參的時(shí)候淪為普通指針。這里把a(bǔ)rr賦值給*p,通過(guò)指針訪問數(shù)組元素,其實(shí)數(shù)組下標(biāo)的訪問方式就是通過(guò)指針實(shí)現(xiàn)的。所以關(guān)鍵就在于p的取值,即地址是第幾個(gè)元素的地址。
*(p++)+=89
*(p++)=*(p++)+89//兩個(gè)++都是在p之后,所以在這一行中p的值沒有影響,所以p還是指向第一個(gè)元素,只不過(guò)第一個(gè)元素被修改為90
按道理繼續(xù)格式化輸出的p已經(jīng)加了一次,應(yīng)該指向第二個(gè),第三個(gè)元素。但是程序輸出不是這樣
#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; }若是直接在修改第一個(gè)元素之后輸出*p,是第二個(gè)元素的值,如果連同*(p++)一起輸出,先計(jì)算p++,再輸出,這時(shí)候p指向了第三個(gè)元素。
總結(jié)
以上是生活随笔為你收集整理的指针%p输出的一些认识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Retrofit与RXJava整合
- 下一篇: Verilog HDL语言设计一个比较电