娓娓道来c指针 (1)指针就是地址

(1)指针就是地址

首先明确一个观点:指针就是地址。这是理解指针的起始一步。

直观感受下,变量的地址

int main()
{
	int foo;
	int *foo_p;
	foo = 5;
	foo_p = &foo;
	printf("   foo...%d\n", foo);
	printf("*foo_p...%d\n", *foo_p);
	printf("  &foo...%p\n", &foo);
	printf(" foo_p...%p\n", foo_p);
	printf("&foo_p...%p\n", &foo_p);
	return 0;
}

运行

几点说明:

  1. %p中的p是pointer(指针)的意思,专门用于打印指针变量中的内容。
  2. 有时看到用%x打印指针的,虽然结果一样,但含义完全不同。%p:用合适的方式(一般是十六进制)输出指针变量中存放的另一个变量的地址;%x:用十六进制的方式打印出变量的值。并且在我的环境中使用%x打印指针变量的话,会省略前面的0。

指针变量的示意图

左上角是变量名,右上角是变量地址,中间是变量存储的内容。

看看在我的环境中各基本类型分配的内存大小

int main()
{
	printf("sizeof(char)...%d\n", sizeof(char));
	printf("sizeof(int)...%d\n", sizeof(int));
	printf("sizeof(float)...%d\n", sizeof(float));
	printf("sizeof(double)...%d\n", sizeof(double));
	printf("sizeof(int*)...%d\n", sizeof(int*));
	return 0;
}

在我的环境中,指针类型分配的大小是 sizeof(int*)=4;也就是说用4个字节的大小来存储变量的地址,这也是目前大多数环境下的结果。以后讨论基于这个结果。至于在c标准中,没有规定指针类型的大小,具体大小依靠具体的环境。

时间: 2024-08-24 14:51:32

娓娓道来c指针 (1)指针就是地址的相关文章

娓娓道来c指针 (3)指针和数组

(3)指针和数组 在c中指针和数组似乎有着千丝万缕的关系.其实它们不是一回事:指针是指针,数组是数组,两者不相同. 说它们有关系,不过是因为常见这样的代码: int main() { int array[] = {1,2,3,4,5}; int n = sizeof(array) / sizeof(int); int *p = array; int i; for (i = 0; i < n; i++) printf("p[%d]...%d\n", i, p[i]); system

承诺c指针 (1)指针是地址

(1)是地址 首先明白一个观点:指针就是地址.这是理解指针的起始一步. 直观感受下.变量的地址 int main() { int foo; int *foo_p; foo = 5; foo_p = &foo; printf(" foo...%d\n", foo); printf("*foo_p...%d\n", *foo_p); printf(" &foo...%p\n", &foo); printf(" foo

对象布局已知时 C++ 对象指针的转换时地址调整

在我调试和研究 netscape 系浏览器插件开发时,注意到了这个问题.即,在对象布局已知(即对象之间具有继承关系)时,不同类型对象的指针进行转换(不管是隐式的从下向上转换,还是强制的从上到下转换)时,编译器会根据对象布局对相应的指针的值进行调整.不管是 microsoft 的编译器,还是 gcc 编译器都会做这个动作,因为这和 C++ 对象模型有关. 举一个简单的例子,如下代码: #include <stdio.h> class A { public: int x; void foo1()

指针、指针变量梳理,取地址与取值运算

#include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int a = 199; int *p; p = &a; printf("a=%d\n", a); printf("&a=%d\n", &a); printf("&p=%d\n", &p); printf("p=%d\n", p); printf(&q

Little-endian的一个好处:在变量指针转换的时候地址保持不变

Big-endian 的内存顺序和数字的书写顺序是一致的,方便阅读理解.Little-endian 在变量指针转换的时候地址保持不变,比如 int64* 转到 int32* 各有利弊,统一就好,目前看来是 little-endian成为主流了. ------------------------------------------------------------------------- 因为现在基本上遇不到PowerPC的服务器,所以我曾经比较变态的让通讯协议里全使用小端格式,然后用指针强制

娓娓道来c指针 (7)指针运算

(7)指针运算 在前几篇文章中,我们已经见过指针运算的使用场景,并多次使用指针运算来进行验证.这里我们来特别地总结下,指针运算的本质含义. 在c语言中,假设p.pa.pb都是某种类型的指针,这样的运算被称为指针运算: ,前提:pa和pb类型相同. 其本质是 1.. 2.,得到的是逻辑存储单元数,而不是简单的物理字节数. 代码验证 int main(void) { int array[] = {1, 2, 3}; int *pa = array; int *pb = array + 3; prin

指针&amp;指针的指针,地址&amp;地址的地址

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int main(int argc, char* argv[]) 5 { 6 char *s[]={"man","woman","girl","boy","sister"}; 7 char* *q=NULL; //指针的指针 8 int k; 9

区别&lt;指针、指针的地址、指针的值&gt;

指针是指向某一个类型(内置的或者自定义的)的对象的变量. 通常我们说的“指针”,意指它所指向的对象的地址,也就是“指针的值”: 但是指针本身也是变量,也对应内存中的一块地方,因此“指针的地址”就是存储这个指针变量的内存的地址: 结合代码来看: /************************************************************************* > File Name: newd.cpp > Author: zeyuhu > Mail: [e

常量指针(指针指向的数值是常量)指针常量(指针指向的地址是无法改变的)

常量与常量指针 #include <iostream> using namespace std; int main() { int a = 3; const int *p = &a; cout << *p << endl; // *p = 20; // cout << *p << endl;//变量的值是常量,不能通过修改指向的变量的值,都是可以将指针进行指向别的地址. a = 20; cout << *p <<

详解 常量指针和指针常量

说一下 常量指针和指针常量 的区别. 常量指针 指向常量的指针,也就是说指针指向的对象是常量,指向的常量不能修改.指针不是一个常量, 可以把指针指向别一个常量. 常量指针是我们最常用的,一般声明形式如下: const int *p; int const *p; 例: int a(1), b(3); const int *p; // 或者是 int const *p; p = &a; std::cout << "address : " << p <&