// 定义一个 int 类型的 a 变量并赋值为 10
int a = 10;
// 定义一个 int 类型的指针 p
int *p;
// & 的操作是取地址, &a 表示获取 a 变量存储空间的首地址 。 最后将获取的地址值赋值给指针。
p = &a;
// * 表示访问 指针 指向的存储空间, *p 表示获取 p 指针指向的存储空间并将存储空间的值修改 为 100
*p = 100;
Int *p; 和 *p = 100; 的区别:
Int *p 的 * 起标识作用,表明定义的p是一个指针。
*p = 100 的 * 表示通过访问p指向的地址空间
NSLog(@"%d", a);
打印结果:
2016-07-29 12:50:05.958 runtimeDemo[78195:7517694] 100
指针只能存储地址值,通过指针可以对指针指向的内存进行空间进行存取操作。
指针使用注意点:
Int *p;
double d=10.0;
p=&d;
// 不建议此种做法
p 可以操作的内存空间和 d 实际的内存空间不匹配。容易造成内存操作的错误。
Int *p;
p=200;
//指针变量只能存储地址
Int *p;
printf(“%d\n”,*p);
//指针变量未经初始化,不要拿来间接访问其他的存储空间
Int *p=&a;但是不能写成 int *p;*p=&a;这种写法没有任何的意义,可以认为*是和类型符一起使用的。
*是指针运算符,访问指针指向的空间
指针在数组中的使用
// 定义一个 ages 数组, ages 变量其实就是一个指针,指向的是 age[0] 的地址。(也可以理解为 ages 指向的是 ages 数组整体存储空间的首地址)
int ages[5]={10,9,8,7,6};
// 使用数组访问的方式直接进行数组内存的访问
for (int index = 0; index < 5; index ++) {
NSLog(@"%d", ages[index]);
}
// 定义一个 int 类型的指针
int *d;
// 将 ages 的内存地址赋值给 d
d = ages;
// 使用指针来进行数组内存的访问
for (int index = 0; index < 5; index ++) {
NSLog(@"%d", *(d + index));
// 这一句和上面两句的意思是一样的。
// NSLog(@"%d", d[index]);
}
*d == d[0]
*(d + 1) == d[1]
*(d + 2) == d[2]
*(d + 3) == d[3]
在某种意义上来说可以简单的将指针当做数组来使用。
指针在结构体中的使用
struct stu{
int num;
char *name;
char sex;
float score;
} *ps, boy[5]={
{101, "Zhou ping", 'M', 45},
{102, "Zhang ping", 'M', 62.5},
{103, "Liou fang", 'F', 92.5},
{104, "Cheng ling", 'F', 87},
{105, "Wang ming", 'M', 58}
};
// ps 为指向 stu 结构体的指针。
// boy 为 stu 结构体的数组。
int main(){
/*
boy 默认指向的是 boy[0] 的地址值。
ps = boy 是 ps 指向 boy[0] 的地址值
boy+5 = boy[4] 的地址值
*/
for(ps=boy; ps<boy+5; ps++) {
printf("%d\t%s\t%c\t%f\t\n", ps->num, ps->name, ps->sex, ps->score);
}
return 0;
}
-> 是一个整体,它是用于指向结构体、C++中的class等含有子数据的指针用来取子数据。
换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”。
(*p).a,和p->a完全等效
** 关于指针 ++ 或者 + 1 的说明 **
指针加 1 表示的是指针移动一个指针类型的内存大小。不是单纯的数组加 1 操作。
声明一个 int 类型的指针指向 char 类型的变量。在进行指针操作的时候就出现错位。