*** 新的知识 ***
从这篇日志开始,便是传说中的指针了,据说很难,气势上藐视它,态度上重视它。认真总结,不放过任何一个知识点。
一、 指针的重要性
指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学的很好,那你干脆说没学过C语言。
二、 指针的定义与赋值
1、 先定义后赋值:
int a = 10;
int *p;
p = &a;
2、 定义的同时赋值:
int a = 10;
int *p = &a;
注意:int *p; p = 1000; //p指向的地址是1000
int *p; *p = 100; //p指向的地址里面的数据是100
int *p; *p = &a; //p指向的地址里面的数据是a的地址
%p输出指针里面存储的地址值。
不能乱用,比如:int a = 10; float *p = &a;
指针只能存储地址。
三、 指针变量所占用的存储空间
不管指针指向什么类型的数据,它存储的都是内存地址。所以所有的指针变量所占的空间都是一样的,与指针变量的类型无关,只跟编译器有关。在Xcode中,指针变量占8个字节(因为内存地址都是很大的数字)。
四、 为何指针变量要分类型
指针可以用于指向任何类型的变量(数组、结构体、其他指针等),这就需要定义不同类型的指针。如果指针没有指向相应类型的变量,那么运算结果就很有可能是错的。
在数组中经常会使用*(p+i)这种形式,指针可以和数字相加,指针的类型决定了当指针+1时跳过多少个字节。当为int类型时,就会跳过四个字节;当为char类型时,就会跳过一个字节。
五、 为什么要使用指针
1、 在函数调用时使用指针,可以让形参复制实参的地址,从而在函数内部修改外部变量的值。
2、 指针可以让函数返回多个值。
六、 指针与函数
1、 数组元素的访问方式
1> ages[i] //数组名[下标]
2> p[i] //指针变量名[下标]
3> *(p + i) //指针加上一个数值
2、 数组指针和函数参数
用函数操作一个数组,可以使用数组作为函数参数,也可以使用数组指针作为函数参数。调用时,实参都是数组名,因为数组名就是数组首元素的地址。
注意:两种方式中函数参数的本质都是一个指针,
所以如果在函数内部使用
sizeof(数组名),获得的总是8个字节(即指针的大小),而不是整个数组所占的字节数。
七、 指针与字符串
1、 字符串的定义
1> 利用数组 char name[] = "itcast";
特点:这样定义的字符串其实是一个变量字符串,里面的字符是可以修改的。
2> 利用指针 char *name = "itcast";
特点:这样定义的字符串其实是一个常量字符串,里面的字符是不能修改的。
2、 字符指针数组
定义一个字符指针数组:
char *name[2] = {"jack","rose"};
其实用字符串数组也可实现上面的存储:
char name[2][10] = {"jack","rose"};
八、 返回指针的函数
指针也是
C
语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的。
返回指针的函数的一般形式为:类型名
*
函数名
(
参数列表
)。
九、 指向函数的指针
1、
为什么指针可以指向一个函数
函数作为一段程序
,
在内存中也要占据部分存储空间
,
它也有一个起始地址
,
即函数的入口地址
。
函数有自己的地址
,
那就好办了
,
我们的指针变量就是用来存储地址的
。
因此
,
可以利用一个指针指向一个函数
。
其中
,
函数名就代表着函数的地址
。
2、
指向函数的指针的定义
定义的一般形式
:
函数的返回值类型
(*
指针变量名
)(
形参
1,
形参
2, ...);
3、 使用注意:
1> 由于这类指针变量存储的是一个函数的入口地址
,
所以对它们作加减运算
(
比如
p++)
是无意义的
2> 指向函数的指针变量主要有两个用途
:
调用函数,
将函数作为参数在函数间传递。
详细请查看:
www.itheima.com