一、指针的定义
定义:指针一般是指指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。
理解:类似于一个有着特定指向的箭头,指针变量即是所指方向。指针本身是一个地址,对指针取地址即是取出该地址上的对应的东西(数字、字符等)。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i=1;
int *p=&i;//此处*p是定义了一个指针变量p
printf("i的值为:%d\n",i);
printf("对p取值为:%d\n",*p);//此处*p是一个表达式,*是取值表达式
printf("i的地址为:0x%08x\n",p);//指针中存放的是i的地址
system("pause");
return 0;
}
二、指针的使用场景
1.指针的传递
#include<stdio.h>
#include<stdlib.h>
int change(int j)
{
j=1;
}
int main()
{
int i=5;
printf("before change i=%d\n",i);
change(i);
printf("after change i=%d\n",i);
system("pause");
return 0;
}
//变量i的值不会发生改变,由于i的地址与j的地址是在两个栈空间内,对i与j的值改变互不影响
#include<stdio.h>
#include<stdlib.h>
int change(int *j)
{
*j=1;//间接访问得到变量j
}
int main()
{
int i=5;
printf("before change i=%d\n",i);
change(&i);//传递变量i的地址
printf("after change i=%d\n",i);
system("pause");
return 0;
}
//变量i的值会发生改变,由于change函数是对地址进行操作,传递到change函数中的正是i的地址
理解:即利用函数修改main函数中的数值时,需要利用指针的传递对地址进行操作。栈空间是不同的,但是想要修改的数的地址是唯一的,对该地址进行间接操作以达到修改main函数中数值的目的。
2.指针的偏移
代码如下(示例)——服务于一维数组:
#include<stdio.h>
#include<stdlib.h>
#define N 5
int main()
{
int a[N]={1,10,100,1000,10000};
int *p,i;
p=a;//其实是p=&a[0],让p指向数组中第一个元素
for(i=0;i<N;i++)
{
printf("%d ",*(p+i));
}
printf("\n");
p=&a[4];//让p指向数组中最后一个元素
for(i=0;i<N;i++)
{
printf("%d ",*(p-i));
}
system("pause");
return 0;
}
//将指针指向数组的任意一个元素,对指针变量进行加减也即是对指向元素数组的角标进行相应的加减
理解:指针作为箭头,当它指向数组内的某个位置时,根据数组连续存放的特性,对指针变量进行加减操作也相当于是对数组角标进行加减操作,所以一一对应之后输出相应的数值
3.二级指针的传递
二级指针:指针变量的内容存储的是某个一级指针的地址值。
#include<stdio.h>
#include<stdlib.h>
//当在子函数中修改主函数某一个一级指针的变量的值需要用到二级指针
void change1(int **p2,int *pj)
{
*p2=pj;
}
int main()
{
int i=10,j=5;
int *pi=&i,*pj=&j;//把该变量的地址值传给子函数
int **p2;
printf("before: i=%d,j=%d,*pi=%d,*pj=%d\n",i,j,*pi,*pj);
change1(&pi,pj);
printf("after: i=%d,j=%d,*pi=%d,*pj=%d\n",i,j,*pi,*pj);
system("pause");
}
3.二级指针的偏移
代码如下(示例)——二级指针服务于指针数组:
可用于索引排序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 5
void print(char **p2,int len)
{
int i;
for(i=0;i<len;i++)
{
puts(p2[i]);
}
}
int main()
{
char b[5][10]={"zhangsan","lisi","wangmazi","zhaoliu","qianqi"};
char *p[N];//二级指针(指针数组名里存的是二级指针)
//char **p2;
char *tmp;//排序用的中间变量值
int i,j;
//p2=p;
for(i=0;i<N;i++)
{
p[i]=b[i];
}
printf("before sort\n");
for(i=0;i<N;i++)
{
puts(p[i]);
}
printf("----------------------\n");
for(i=5;i>1;i--)//冒泡排序,字符串比较用strcmp
{
for(j=0;j<i-1;j++)
if(strcmp(p[j],p[j+1])>0)
{
tmp=p[j];
p[j]=p[j+1];
p[j+1]=tmp;
}
}
printf("after sort\n");
print(p,5);
printf("----------------------\n");
printf("original state\n");
for(i=0;i<N;i++)
{
puts(b[i]);
}
system("pause");
return 0;
}
4.函数指针
通过函数指针可以将某种行为传递给一个函数,这样可以调用函数a达到执行函数b行为的目的。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定义函数指针,初始化只能赋函数名
void a(void (*p)())
{
p();
}
void b()
{
printf("I am function b\n");
}
int main()
{
void (*p)();//定义了一个函数指针变量,用于存储函数的入口地址
p=b;//函数指针的返回值一级入参要与函数保持一致
a(b);//传递一种行为
system("pause");
return 0;
}
个人理解:定义函数指针变量,存储函数,利用指针实现间接调用。
5.练习题
用指针实现将包含字符数字的字符串分开,使得分开后的字符串前一部分是数字后一部分是数字,后一部分是字母; 如:
h1ell2o4 ——>124hello
w2or36l4d6 ——>23646world
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。