每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。
1 2 3 4 5 6 7 8 9 10 11 12 #include <stdio.h> int main () { int var1; char var2[10 ]; printf ("var1 变量的地址: %p\n" , &var1 ); printf ("var2 变量的地址: %p\n" , &var2 ); return 0 ; }
结果:
1 2 var1 变量的地址: 0x7fff5cc109d4 var2 变量的地址: 0x7fff5cc109de
如何使用指针 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> int main () { int var = 20 ; int *ip; ip = &var; printf ("Address of var variable: %p\n" , &var ); printf ("Address stored in ip variable: %p\n" , ip ); printf ("Value of *ip variable: %d\n" , *ip ); return 0 ; }
结果:
1 2 3 Address of var variable: bffd8b3c Address stored in ip variable: bffd8b3c Value of *ip variable: 20
结构体指针 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <stdio.h> struct house { char location[20 ]; float area; int price; }; int main () { struct house kangqiao = {'昌邑' , 132.0 , 5000 }; # 位置、面积、价格 struct house * h ; # 定义指针h h = &kangqiao # 给指针h赋值 printf ("location=%s\n" , (*h).location); # 打印location # (*h).location、h->location、kangqiao.location 这三种写法是等价的 return 0 ; }
数组指针 1 2 3 4 5 6 7 8 #include <stdio.h> int main () { int arr[] = {1 ,2 ,3 ,4 }; int * p = arr; # 现在p指向arr第一个元素也就是arr[1 ]的地址 p++; # 现在p向后移动一位,指向arr的下一个元素,也就是arr[2 ] # int * p = arr; p++; 这种写法等价与 int * p = arr + 1 return 0 ; }
int _ p = arr; p++; 这种写法等价与 int _ p = arr + 1
C 语言规定数组代表数组所在内存位置的首地址,也就是 str[0]的地址,即 str=&str[0];
而 printf(“%s\n”, str); 为什么用首地址就可以输出字符串。
因为还有一个关键,在 C 语言中字符串常量的本质其实是一个地址,这个是许多初学者比较难理解的问题。