首页 > 代码库 > 娓娓道来c指针 (1)指针就是地址

娓娓道来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标准中,没有规定指针类型的大小,具体大小依靠具体的环境。





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