指针的基本概念:
重要性:
如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言。-----引用李明杰老师的一句话
格式:
变量类型 * 变量名 例:int *p; 作用:能够根据1个地址值访问并修改对对应的存储空间
使用:
代码联系1
#include <stdio.h> int main() { int a = 80; //定义一个整形变量a且赋值80; int *p; //定义一个int型指针变量*p p = &a; //取得变量a的地址并且赋给指针p *p = 10; //对p所指向的存储空间(也就是a)赋值 printf("a = %d",a); //输出变量a的值 return 0; }
运行结果:a = 10
int *p中的*是指针的标志
p = &a; 指针变量只能存储地址
int *p; 指针变量p前面定义了int,说明指针只能指向int 型数据
代码练习2
#include <stdio.h> //通过使用指针改变变量a的值 int change(int *n) { *n = 10; //对n所指向的存储空间(也就是a)赋值 } int main() { int a = 80; //定义一个整形变量a且赋值80; change(&a); //调用change函数,把变量a的地址送给change函数的形参 printf("a = %d",a); //输出变量a的值 return 0; }
运行结果:a = 10
注:如果不利用指针则无法在change函数内修改main函数中变量a的值
使用注意:
int main() { int *p; double d = 3.2; p = &d; // 错误原因:int *p只能指向int类型的数据 int *p; p = 200; //错误原因:指针变量只能存储地址 int *p; printf("%d\n",*p); //指针变量未经初始化,不能直接访问其他的存储空间 int *p; *p = &a; //错误写法 }
指向指针的指针:
int main()
{
int a = 20; //定义并向a赋值
int *p = &a; //取得a的值并赋给指针p
int **pp = &p; //取得p的值并赋给指针pp
**pp = 30; //对指针pp所指向的存储空间赋值
printf("a = %d\n",**pp); //输出变量a的值
return 0;
}
运行结果:a = 30
注:指针在任何类型下都是占用8个字节
二、指针和数组
1.数组的访问方式:
数组名【下标】 例:ages[i];
指针变量名【下标】 例:p[i]; //前提是指针变量P指向数组
例:int ages[3] = {41,52,95};
int *p;
p = ages; // 数组名就是数组首元素的地址,此行代码表示把数组元素地址赋给指针p
使用指针遍历数组内各元素:
2.指针变量的+1究竟地址会加几取决于指针变量的类型
int *p p+1相当于地址值+4;
char *p p+1相当于地址值+1;
double *p p+1相当于地址值+8;
int main() {
int ages[5] = {10,8,91,64,7}; int *p; p = &ages[0]; for(int i = 0;i <= 4;i++) { printf("ages[%d] = %d\n",i,*(p+i)); } return 0; }
运行结果:
ages[0] = 10
ages[1] = 8
ages[2] = 91
ages[3] = 64
ages[4] = 7
解析:指针p指向ages[0] p+1则指向ages[1]
三、指针与字符串
定义字符串的方式:
char s[] = "itcast";
char *s = "itcast" 指针s指向字符串的首元素地址
char *s;
*s ="itcast"
char *buf = "it";//指针变量buf指向了字符串的首地址 printf("*buf = %c\n",*buf); printf("buf = %s\n",buf);//
运行结果: buf =i
buf =it %s遇到\0才会停止
返回指针的函数:
类型名 * 函数名(参数列表)
char *test(); 代表函数返回char类型的数据
#include <stdio.h> char *test(); //函数声明 int main() { char *name =test(); //定义一个字符串并且调用指针函数 printf("name = %s\n",name); //输出字符串name内元素 return 0; } char *test() { return "rose"; }
指向函数的指针:
函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);
#include <stdio.h> void test(); int main() { //(*p)是固定写法,代表指针变量p将来肯定指向函数 //左边的void ,代表变量p指向的函数没有函数值 //右边的():指针变量p指向的函数没有形参 void (*p)(); //指针变量p指向了test函数 p = test; //把函数覅只赋给指针p (*p)(); //简介调用函数test test(); //直接调用函数test p(); return 0; } void test() { return "rose"; }