一、指针
1.指针声明格式
1> 格式:变量类型 *变量名。举例:char *p,定义了一个指针变量p,只能存储地址
* 记住*不是指针变量名,只是指针的一个标志
2> 作用:指针就一个作用,存储地址,并且根据地址值访问对应的存储空间
3> 例子
1 int main() 2 { 3 int a = 90; 4 int *p ; 5 p = &a; 6 return 0; 7 }
* 代码在内存中的表示
* 注意点:① int *p只能指向int类型的数据 ②指针变量为经过初始化,不要拿来间接访问其 他存储空间 ③ 不允许这样写:*p = &a ,*p代表访问指针p所指向的存储空间 ④ 定义变量 是的*仅仅是一个象征,没有其他特殊含义
二、指向指针的指针
1.举例
char a='A';
char *p = &a; // 指向char类型存储空间的指针
char **pp = &p; // 指向指针的指针
char ***ppp = &pp; // 三级指针(不经常用)
2.指针应用
1> 实现调用一个函数,得到多个返回值
1 #include <stdio.h> 2 3 int sumAndMinus(int num1, int num2, int *num3) 4 { 5 *num3 = num1 - num2; 6 return num1 + num2; 7 } 8 9 10 int main() 11 { 12 int a = 12; 13 int b = 8; 14 int minus; 15 int sum = sumAndMinus( a, b, &minus); 16 return 0; 17 }
3.指针占用内存
* 指针占用内存与具体编译器有关,在Xcode中任何类型指针占用8个字节
三、指针与数组
1.数组的遍历
//利用下标进行遍历
int nums[3] = {1,2,3,}
for(int i = 0;i < 3; i++)
{
printf("%d ", nums[i]);
}
2.利用指针对数组进行遍历
int nums[3] = {1,2,3,};
int *p = &nums ;
//指针p指向数组的首元素地址;
//(p+1)指向 nums[1];
for(int i = 0;i < 3; i++)
{
printf("%d ", *(p+i));
printf("%d ", p[i ]);
}
四、指针与字符串、指针数组
1.字符数组与字符串的比较
char c1[] = "name";
//上面这行代码表示的是字符数组,所表示的是字符串变量
char *c2 = "name";
//上面这行代码。指针变量c2指向的是字符串首字母。它表所表示的是字符串常量
//两行代码的不同,也与数据在内存中的存储有关
char *c3 = "name";
//注意:c2与c3所便是的是同一个地址
2.定义字符串的两种方式
1> 利用数组
char c[] = "name";
//特点:字符串里面的字符是可以修改的
//使用场合:字符串的内容需要经常修改
2> 利用指针
char *c = "name";
//特点:字符串其实是一个常量字符串,里面的字符是不能修改的
//使用场合:字符串的内容不需要修改,而且这个字符串经常使用
3.指针数组
1> 指针数组的定义
char *name[3] = {"jack", "rose", "tom"};
2> 字符串的输入
//新建一个字符数组,用来保存用户输入的字符串
char name[20];
// 数组名就表示数组首元素的地址
scanf("%s", name);
五、指向函数的指针与返回指针的函数
1.返回指针的函数
char *test()
{
return "name";
}
int main()
{
char *p = test();
return 0;
}
2.指向函数的指针
void test()
{
printf("调用了test函数");
}
int main()
{
//(*p)是固定写法,代表指针变量p将来肯定是指向函数
//左边的void :指针变量P指向的函数没有返回值
//右边的():指针变量p指向的函数没有形参
void (*p)();
//函数名就是函数地址
p = test;
//函数调用的三 种方式
(*p)();// 第一种方式:直接调用
test();// 第二种方式:利用指针调用
p();//第三种方式:利用指针调用
return 0;
}
六、自我总结
好多同学说,指针很难,不容易理解,不过在我看来指针并没有什么,也只不过是一种数据类型,只不过指针存储的是地址,直接可以根据指针存储的地址对相应的内存空间进行操作。同时指针分很多类型,除去基本数据类型指针不说,还有指向函数的指针、指向指针的指针等等,有时读起来都挺拗口,但是这不阻碍我们的理解和使用,不要从心理上担心和害怕,任何类型的出现,都是为了方便我们,而不是给我们找麻烦。只要能从这个角度去理解,我相信拿下指针指日可待。