什么是指针:
指针就是一个变量,是一个存放内容的内存空间。
指针存放的内容是另一个内存空间的起始地址。不同于一般变量存放的就是变量值。
取值操作符*对于指针的作用是取得指针变量存放的内存地址里面的值,不加*取出的是指针变量存放的值(就是一个内存地址)
//定义指针变量 通过指针变量来赋值
#include <stdio.h>
int main(int argc, char *argv[])
{
char a;
//定义一个指针指向变量a的内存地址,p只能指向char类型 因为不同类型的变量所占用的字节数不一样
char *p=&a
*p=10;
printf("%d",a);//打印出来的结果为 10
printf("%d",*p);//这样相当于取出变量a的值通过内存地址
return 0;
}
#include <stdio.h>
//使用指针交换两个的值
void swap(char v1 char v2){
char temp;
temp=v1;
v1=v2;
v2=temp;
}
void swap2(char *v1 char *v2){
char temp;
temp=*v1;
*v1=*v2;
*v2=temp;
}
int main(int argc, char *argv[])
{
char a=10;
char b=20;
swap(a,b);
printf("调换后的值为 a=%c::b=%c",a,b);
//上面的这种方法是不能把a和b的值过来的,而通过指针就可以
swap2(&a,&b);
printf("通过指针调换后的值为 a=%c::b=%c",a,b);
return 0;
}
#include <stdio.h>
//通过指针返回和与差(其实可以返回无限个返回值)
int sumAndMinus(int v1,int v2,int *p){
*p=v1-v2;
return v1+v2;
}
int main(int argc, char *argv[])
{
int a=10;
int b=4;
//定义和与差变量
int sum;
int minus;
sum=sumAndMinus(a,b,&minus);
printf("sum=%d :: minus=%d",sum,minus);
return 0;
}
#include <stdio.h>
//指针和数组
int main(int argc, char *argv[])
{
int a[2];
int *p=&a[0];//每个数组的第一个元素的内存地址就是该数组的内存地址
test1();
test2();
test3();
return 0;
}
//通常遍历数组代码
void test1(){
int a[3]={1,2,3};
for(int i=0;i<3;i++){
printf("a[%d]=%d\n",i,a[i]);
}
}
//利用指针来遍历数组
void test2(){
cahr a[3]={1,2,3};
char *p=&a;//让指针指向第一个元素
for(int i=0;i<3;i++){
//char 类型只有一个字节,这里的内存地址相当于是p=fff1 ,p+1=fff3 数组相邻元素的内存地址是相靠的
printf("a[%d]=%d\n",i,*(p+1));
}
}
//int 数组类型的遍历
void test3(){
int a[3]={1,2,3};
int *p=&a;//
for(int i=0;i<3;i++){
//int数组 占两个字节 这里的内存地址相当于是p=fff1 ,p+1=fff3
printf("a[%d]=%d\n",i,*(p++));
//这样调用也是可以访问的 但是a++这里不可以,不能够改变a的内存地址(a是个常量)
printf("a[%d]=%d\n",i,*(a+i));
}
int *h=a;
for(int i=0;i<3;i++,h++){
printf("a[%d]=%d\n",i,*h);
}
}
//如果你的形参是个数组,既可以传数组名,也可以传指针
//如果你的形参是个指针,既可以传指针,也可以传数组名 可互相切换
//指针修改数值的值
change(char * c){
*c=10;
*c+2=11;
c[2]=10;
}
int main(int argc,const char * argv[]){
char a[3];
char *p=a;
change(a); //这里传的就是数组a的内存地址
change(p);
printf("%c",a[0]);
}
#include <stdio.h>
//字符串和指针
int main(int argc, char *argv[])
{
char s[6]="laotan";//这种定义的是个字符数组
for(int i++;i<6;i++){
printf("%c\n",s[i]);
}
char *p=s;
for(;*p!='\0';p++){
printf("%c\n",*P)
}
//char *p p="laotan";这样也可以
char *p="laotan";//这种是定义一个字符串常量,值不可改变
for(;*p!='0\';p++){
printf("%c\n",*P)
}
return 0;
}
#include <stdio.h>
//指向函数的指针:因为函数也是有一个存储地址,也有地址,所以可以用指针指向函数
//返回指针的函数
char * test(){
return "laotan"
}
//函数名就是函数的地址
int sum(int a,int b){
int c=a+b;
printf("%d+%d=%d\n",a,b,c);
return c;
}
int mul(int a,int b){
return a-b;
}
//a、b之间的运算(指针指向函数的应用)
int count(int a,int b,int (*p)(int,int)){
return p(a,b);
}
int main(int argc, char *argv[])
{
printf("%s",test());
//定义了一个被p指向的函数,返回值为int类型,接受两个int类型的参数
int (*p)(int,int);
//让指针变量p指向sum函数
p=sum
p(5,6);//利用指针变量p来调用p
//printf((*)(5,6));
//把函数当成参数来传递,实现你先实现再不改当前调用函数的情况下进行不同的运算
int result=count(3,4,sum);
int result=count(3,4,mul);
return 0;
}