首页 > 代码库 > 【黑马程序员】————指针
【黑马程序员】————指针
一、指针变量的定义
1. 格式:变量类型 *指针变量名;
2. 举例:int *p; char *p2;
3. 注意:定义变量时的*仅仅是指针变量的象征
4.指针变量只能存储地址
5.指针就一个作用:能够根据一个地址值,访问对应的存储空间
6.指针变量p前面的int:指针变量p只能指向int类型的数据
7.任何指针都占用8个字节的存储空间
二、利用指针变量简单修改其他变量的值
1.指向某个变量
int a;
int *p;
p = &a;
或者
int *p = &a;
2.修改所指向变量的值
*p = 10; //这个时候的*的作用:访问指向变量p指向的存储空间
3.在函数内部修改外面变量的值
int a = 10;
change(&a);
void change(int *n)
{
*n = 20;
}
4.清空指针
p = 0;
p = null;
5.指针变量未经过初始化,不要拿来间接访问其他存储空间
三、指针与数组
将数组当做函数参数传入时,会自动转为指针,
1>利用一个指针来接收一个数组,指针变量p指向了数组的首元素
p = &ages[0];
2>数组名就是数组的地址,也是数组首元素的地址
p = ages;
1.数组元素的访问方式
int ages[5];
int *p;
p = ages;
1> 数组名[下标] ages[i]
2> 指针变量名[下标] p[i]
3> *(p + i)
/*
p ---> &ages[0]
p + 1 ---> &ages[1]
p + 2 ---> &ages[2]
p + i ---> &ages[i]
*/
2.指针变量+1,地址值究竟加多少,取决于指针的类型
int * 4
char * 1
double * 8
四、指针与字符串
1.定义字符串的2种方式
1> 利用数组
char name[] = "itcast";
* 特点:字符串里面的字符是可以修改的
* 使用场合:字符串的内容需要经常修改
2> 利用指针
char *name = "itcast";
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
2.定义字符串数组
1> 利用二维字符数组
char names[2][10] = {"jack", "rose"};
2> 利用指针数组
char *names[2] = {"jack", "rose"};
3.指针变量指向字符串的首字符
五、返回指针的函数
l 指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的
l 返回指针的函数的一般形式为:类型名 * 函数名(参数列表)
1 #include <stdio.h> 2 char *test(); 3 4 /* 5 只要求能看懂 6 */ 7 8 int main() 9 {10 char *name = test();11 12 printf("name=%s\n", name);13 14 return 0;15 }16 17 char *test()18 {19 return "rose";20 }
六、指向函数的指针
1. 为什么指针可以指向一个函数?
函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。
2. 指向函数的指针的定义
定义的一般形式:函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);
3. 使用注意
l 由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的
l 指向函数的指针变量主要有两个用途:
调用函数
将函数作为参数在函数间传递
1 void test1() 2 { 3 // (*p)是固定写法,代表指针变量p将来肯定是指向函数 4 // 左边的void:指针变量p指向的函数没有返回值 5 // 右边的():指针变量p指向的函数没有形参 6 void (*p)(); 7 8 // 指针变量p指向了test函数 9 p = test;10 11 p();12 //(*p)(); // 利用指针变量间接调用函数13 14 //test(); // 直接调用函数15 }
七、指向指针的指针
1 #include <stdio.h> 2 int main() 3 { 4 int a = 10; 5 6 int *p = &a; 7 8 int **pp = &p; 9 10 // a = 20;11 12 // *p = 20;13 14 /*15 (*pp) == p16 17 *(*pp) == *p = a18 19 **pp == *p = a20 */21 **pp = 20;22 23 printf("%d\n", a);24 25 //int ***ppp = &pp;26 27 /*28 char a2 = ‘A‘;29 char *p2 = &a2;30 */31 32 return 0;33 }