指针

每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。

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; /* 在指针变量中存储 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 语言中字符串常量的本质其实是一个地址,这个是许多初学者比较难理解的问题。