一、指针
指针是c语言中非常重要的数据类型,如果你说c语言中除了指针,其他你都学的很好,那你干脆说你没学过c语言。
1.指针变量的定义
定义的格式: 变量类型 *变量名;
(1)先定义后赋值
int *p; // 定义指针变量
int a = 9;
p = &a; // 指针变量p指向了变量a
*p = 10; //访问p指向的地址空间
printf("%d\n",a); // 结果为 10
(2)定义的同时赋值
int a = 10;
int *p = &a;
2.指针变量的作用:
指针变量只能存储地址,其实指针就一个作用,能够根据一个地址值,访问对应的存储空间。
二、指向指针的指针
如下所示:
int a = 10;
int *p = &a;
int **pp = &p; //指向指针p的指针pp
***pp = **pp = *p = a; //无论用哪种方式都能改变a的值
三、指针与数组
1.指针指向数组:
int ages[5] = {10,9,8,7,6};
int *p;
p = &ages[0];
或:p = ages;
解释:数组名就是数组的地址,也是数组首元素的地址。
2.数组元素的访问方式
(1)数组名[下标] --->ages[1]
(2)指针变量名[下标] ---->p[1]
(3)*(p+i)
解释(3):指针变量的 +1 是多少字节,取决于指针的类型。
四、指针与字符串
字符串的定义方式:
(1)数组字符串:
char s[] = "haha";
特点:字符串里面的字符是可以修改的。
(2)指针指向字符串
char *s = "haha";
或:
char *s;
s = "haha";
特点:这里的字符串是常量字符串,里面的字符是不可以修改的;
适用场合:字符串内容不需要修改,而且这个字符串经常使用。
五、返回指针的函数(只要看懂)
指针也是c语言的一种数据类型,因此一个函数的返回值肯定可以是指针类型的
返回指针的函数的一般形式:类型名 *函数名(参数列表);
六、指向函数的指针(只要看懂)
定义格式: 函数的返回值类型(*指针变量名)(形参1,形参2,....);
(*z指针变量名) :是固定写法,代表指针变量p 将来肯定指向的是函数。
为什么指针可以指向一个函数:
函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。
注意:函数名就代表着函数的地址。
使用注意:由于这类指针变量存储的是一个函数的入口地址,所以对它们进行加减操作是无意义的。
指向函数的指针主要有两个用途:
1.调用函数;
2.将函数作为参数在函数间传递。
七、小练习
指针练习:
/*
输入两个数
打印两个数的和、差、积、商、以及余数
*/
#include <stdio.h>
//声明jisuan函数
double jisuan(double a,double b, *n, *n2, *n3, *n4);
int main()
{
//定义个变量,保存用户输入的数
double num1, num2,sum,minus,multiply,devide,yushu;
//提示用户输入两个数
printf("请输入两个数:");
//接收用户输入的两个数
scanf("%f,%f"&num1,&num2);
//调用jisuan函数
double sum = jisuan(num1,num2,,&minus,&multiply,&devide,&yushu);
//打印两个数的和、差、积、商、余数
printf("sum=%f,minus=%f,multiply=%f,divide=%f,yushu=%f",sum,minus,multuply,divide,yushu);
return 0;
}
double jisuan(double a,double b, *n, *n2, *n3, *n4)
{
//计算两个数的差
*n = a - b;
//计算两个数的积
*n2 = a * b;
//计算两个数的商
*n3 = a / b;
//计算两个数的余数
*n4 = a % b;
//返回两个数的和
return a + b;
}
输入两个数:10 , 5
运行结果:sum=15,minus=5,multiply=50,divide=2,yushu=0
指针与数组:
/*
有一个数组int a[nSize],要求写一个函数:
int *myfunc(int *p,int nSize);
将a中的都移到数组末尾,将非的移至开始(保持原来的顺序不变)
*/
#include <stdio.h>
//函数的声明
int *myfunc(int *p,int nSize);
int main()
{
//定义一个一维数组
int a[5] = {0,3,0,2,1};
int b[5] = myfunc(a[5],5);
for(int i = 0;i < 5;i++)
{
printf("%d ",b[i]);
}
return 0;
}
//定义函数
int *myfunc(int *p,int nSize)
{
int j = nSize - 1;
for(int i = 0;i < nSize;i++)
{
int temp;
if(*(p+i) == 0)
{
temp = *(p+i);
for(int k = i;k < j;k++)
{
*(p+k) = *(p+k+1);
}
*(p+j) = temp;
j--;
}
}
return p;
}
运行结果:3 2 1 0 0
指针与字符串:
#include <stdio.h>
int main()
{
//指针变量name指向了字符串的首字符
char *name = "rose";
//name 和name2 指的是同一个内存空间
char *name2 = "rose";
//打印的首字符
printf("%c\n",*name);
//打印的字符串,%s会从某个地址开始一个一个输出字符,直到遇到'\0'为止
printf("%s\n",name2);
return 0;
}
运行结果为:r
rose