一,概念
指向一个对象,可以取出它的地址,根据地址找到它并修改它的值。
指针只能存地址值。
二,格式
变量类型 *变量名
三,内存分析
指针变量分配有自己的一块内存,它存的是地址值。8个字节的空间。
如视频里所说,变量也有自己的个存储空间a = 90;
指针内存分析:就是为了取值和赋值
int i = 2; char c = 1; int *p ; p = &c;
0000 0001
0000 0010
0000 0000
0000 0000
0000 0000 0000 0000 0000 0010 0000 0001 = 513
四,指针与数组有密不可分的关系,数组和字符串也密不可分的关系。但在OC中用不上。OC中实在用就是C语言的字 符串。
地址值是十六进制形式存在
P+1
指针中的+1是掉到下一个元素的意思。加多少取决于数据类形型。
五,使用注意
下面用一些代码来验证一下:
#include <stdio.h>
int main()
{
int *p;
int a = 90;
p = &a;
*p = 10; // *p指向了a,它可以间接的修改a的值。
a = 20;
//printf("%d\n",a);
printf("%d\n",*p);
// 首先是*p去修改了90变为10,输出a已经修改了那块内存空间里的值,因p是指向a,所以根据它的变化而变化
return 0;
}
小练习来巩固一下
#include <stdio.h>
void change(int *n);
int main()
// 一个大的内存条,分一小块里面有main函数(a = 90),分一小块change函数(n = 20),变量有自己的存储空间,就有自己的地址值。
{
int a = 90;
change(&a);
//这里不能传a的值,应该传a的地址值。
printf("%d\n",a);
return 0;
}
//所以形参要变是指针来接收地址。8个字节。
void change(int *n)
{
*n = 10; //相当于int *n=&a
}
注意点:指针定义和初始化
<span style="font-size:18px;">#include <stdio.h>
int main()
{
//int *p; 不建议
//double d = 10.0;
//p = &d;
//int *p; // 没有给它负一个地址值,不能给来用
//printf("%d\n",*p);
//int *p; //融合成一句 int *p = &a;
//p = &a;
//int *p = &a; 正确写法,*仅是一个象征,没有说p指向存储空间。
//p = &a; 这句可不用写。
// *p = 20; 这里的*是指指针指向了存储空间。
// *p = &a; 错误写法 ,自己存自己,不可取
//int *p; 错误,只能存储地址
//p = 10;
char c = 'A';
char *cp = &c;
*cp = 'D';
printf("%c\n",*cp); // 取出指针里的值 %c输出字符的占位符。
return 0;
}</span>
再来一些小练习
<span style="font-size:18px;">#include <stdio.h>
int main()
{
//int *p; 不建议
//double d = 10.0;
//p = &d;
//int *p; // 没有给它负一个地址值,不能给来用
//printf("%d\n",*p);
//int *p; //融合成一句 int *p = &a;
//p = &a;
//int *p = &a; 正确写法,*仅是一个象征,没有说p指向存储空间。
//p = &a; 这句可不用写。
// *p = 20; 这里的*是指指针指向了存储空间。
// *p = &a; 错误写法 ,自己存自己,不可取
//int *p; 错误,只能存储地址
//p = 10;
char c = 'A';
char *cp = &c;
*cp = 'D';
printf("%c\n",*cp); // 取出指针里的值 %c输出字符的占位符。
return 0;
}</span>
来看一下指针与数组的关系吧
<span style="font-size:18px;"> #include <stdio.h>
int main()
{
int ages[5] = {19,11, 23,34,13};
int *p;
p = &ages[0];
//printf("%p\n",p); &ages[0]
// printf("%p\n",p+1); &age[1]
// printf("%p\n",p+2); &age[2]
// p[i] ages[i] 这也是一种访问方式
for (int i = 0;i <5; i++)
{
printf("ages[%d]=%d\n",i ,*(p+i));
}
//p = ages; 指向了首元素
//for(int i = 0;i < 5; i++)
//{
// printf("%d\n",ages[i]);
//}
return 0;
}</span>
指针与字符串的关系
<span style="font-size:18px;">#include <stdio.h>
int main()
{
char name[] = "it"; //可以改里面的值
char *name2 = "it";//不可以改里面的值,只开一次空间省内存,使用场合:不修改的经常用的。
//"it" = 'i' + 't'
//char *name2 = "it"; 字符串的指针存储方式,指向首字符i
printf("%s\n",name2);
}
</span>
利用一个指针变量指向一个数组。
<span style="font-size:18px;">#include <stdio.h>
void change(int *array);
int main()
{
int ages[5] = {12,33,44,54,23};
change(ages);
return 0;
}
void change(int *array)
{
printf("%d\n",*(array+2));
}</span>