[英]Learning C - Pointers and memory addressing
我正在學習C編程,我有一個關於指針的簡單問題......
我使用以下代碼來玩指針:
#include <stdio.h>
int main (int argc, const char * argv[]) {
int * c;
printf("%x\n",c);
return 0;
}
當我打印C的值時,我返回0.但是,當我打印&c(即printf(“&x \\ n”,&c)時,我在內存中得到一個地址...
打印指針時,我不應該在內存中獲取地址(即printf(“%x \\ n”,c)?
--- 編輯 ---
#include <stdio.h>
#include <stdlib.h>
int main (int argc, const char * argv[]) {
char * a = malloc(11);
printf("String please\n");
scanf("%s",a);
printf("%s",a);
}
問題是,為什么printf(“%s”,a)返回字符串而不是存儲在?中的地址?
我不應該使用* a跟隨指針然后打印字符串?
您當前的程序不正確。 您在第一次使用之前定義變量並且不設置值。 c
的初始值不保證,但你很幸運,它等於0
。 這意味着c
指向無處。 當你打印&c
你打印變量c
本身的地址。 實際上兩個版本都打印地址。
printf實際上是一個非常復雜的功能,可以通過為它提供正確的格式說明符來做各種技巧。
在你的字符串示例中:
printf("%s", a)
“%s”告訴printf函數應將以下變量視為字符串。 在C中,字符串是指向一個或多個char的指針,由包含0的char終止。這是一個非常常見的請求,這就是printf支持觸發這種相對復雜行為的格式說明符“%s”的原因。 如果要打印字符串指針中包含的地址,則必須使用之前找到的格式:
printf("%x\n",a);
它告訴printf將a的內容視為無符號整數,並將其打印在base 16中。
* a只是a指向的值,它只是一個字符。
你可以打印單個字符
printf("%c", *a);
有int * c; 如果打印c的值,則返回一個應該被解釋為整數值的內存地址的值。 在您的示例中,它可能是0或完全不同的東西,因為您沒有初始化c。
如果你打印&c你得到指針c的內存地址(存儲在堆棧中)。
#include <stdio.h>
int main (int argc, const char * argv[]) {
int * c;
int a=10;
c = &a;
printf("%x\n",c);
return 0;
}
這可能會澄清當你使int指針指向內存中的某些內容時會發生什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.