关于指针

关于指针

关于指针:

1.定义:

two ways.

1
int a = 5, *p = &a;

1
2
int a = 5, *p;
p = &a;

如果这么写是不合法的:

1
2
int a = 5, *p;
*p = &a;
可以理解为该变量存储的内容是地址

2.自增自减

\(*p++\)

1
2
3
4
5
针对p指针加一,然后间接访问
int a[6] = {1, 4, 7}, *p = a;//a本身就是地址,不需要再&
cout << *p; // 1
*p++;
cout <<*p; // 4
\((*p)++\)
1
2
3
4
5
 p指针间接访问的内容加一
int a[6] = {1, 4, 7}, *p = a;
cout << *p; // 1
(*p)++;
cout << *p; // 2

3.指针与其他结合

宏定义

1
2
3
4
#define type1 char *
typedef char *type2;
type1 s1, s2;
type2 s3, s4;

define仅仅是替换,typedf是定义了一个新的数据类型 上面的代码块也可以写成如下:

1
2
3
4
#define type1 char *
typedef char *type2;
char *s1, s2;
type2 s3, s4;
显然,s1,s3,s4是指针类型变量

结构体

1
2
3
4
5
6
struct Student
{
char name[10];
int age;
char gender;
}std[3], *p = std;

当需要用指针来访问结构体里面内容,两种办法。

1
(*p).age = p->age

不允许写 (*p)->age

*p仍旧是一个值,可以这么考虑,你见过有人写std[0]->age的吗?

还要注意,p->age只是一个值,在scanf中仍旧需要取地址&

遇到字符是%c,需要&

遇到字符串是%s,不需要&