C语言--指针


 一、基本使用
定义格式 :变量类型   *变量名
先定义后赋值
 
指针变量只能存储地址。作用:能够根据一个地址值,访问对应的存储空间。
代码示例 :
int  main(){

int *p;        //定义一个指针变量
int a=80;     //定义一个普通变量
p=&a;          // 指针变量p指向变量a  ,把a的地址传给指针p

*p=10;           //改变了a的值   此时a=10
 
return 0;
}


*p=10; 赋值  *p取值
指针变量类型,指针变量只能指向同类型的数据

例题:
#include<stido.h>
void change(int *n);     //声明函数
int main()
{
int  a= 90;               //定义一个普通整型变量
change(&a);              //调用函数并传递a的地址
printf("&d\n",a);           //打印变量a的值
return 0;
}
void change(int *n)         //创建带参函数,以指针 *n作为形参 ,主函数把a的地址传递过来,此时*n=90
{
*n=10;               //为*n赋值10,改变了a的值,主函数打印出10
}



注意:
int *p=&a;        //定义变量时的*仅仅是一个象征,没有其他特殊含义,可以理解为  (int *)p=&a;
错误写法 *p=&a;         
正确:p=&a;
*p=20;           //*的作用,访问指向变量p指向的存储空间

练习:
在一个函数中实现计算两个变量的和跟差
#include<stdio.h>
int sumAndMinus(int n1,int n2,int *n); //函数声明
int main()
{
int a=1;
int b=2;

int sum;     //存储和
int cha;     //存储差

he=sumAndMinus(a,b,&cha);     //为he赋值,调用函数传递a,b的值以及cha的地址

return 0;
}
int sumAndMinus(int n1,int n2,int *n)
{
*n=n1-n2;          //因传递进来的为cha的地址,用指针改变cha的值
return n1+n2;     //返回he

}



数组与指针

利用指针遍历数组

int ages[5]={1,2,3,4,5};          //定义一个数组
int  *p;               //定义一个指针
p=&ages[0];        //指针p指向数组首元素
for(i=0;i<5;i++){
printf("ages[%d]=%d\n",i,*(p+i));

}



p---->&ages[0]
p+1----->&ages[1]
p+2----->&ages[2]
p+i----->&ages[i]

数组元素访问方式:
1.数组名[下标]  ages[i]
2.指针变量名[下标]  p[i]    --   指针要指向数组名
3.*(p+i)

指针变量+1加多少,取决于指针的类型
int *          4
char *      1
double *     8

定义字符串的两种方式:
利用数组
char name[]="it";
利用指针
char *name2 ="it";     指针变量name2指向了字符串的首字符
printf("%s\n",name2);     
%s 打印字符串 ,从首地址开始直到遇到  '\0'

数组存放字符串与指针存放字符串的区别:
char name[] ="it";
name[0] = 'T';
此为字符串变量,可以任意修改数组内的字符。
使用场合:字符串的内容需要经常修改。

char *name2 ="it";
*name2 ='T';
错误,引起程序崩溃,为字符串常量,不可以修改其内的字符。
使用场合:字符串的内容不需要修改,而且这个字符串经常使用。

char *name2="it";
char *name3="it";
name2与name3指向同一个地址,"it"放在常量区,有了一个缓存,当下次再访问时,代表同一个常量不需要再开辟存储空间存储此常量。

 
定义字符串数组:
指针数组
char *name[5] ={"jack","rose","micl"};
二维字符数组
char name[2][10] ={"jack","rose"};


返回指针的函数
char *test()
{
     return "rose";
}



指向函数的指针
void test()
{
printf("调用函数\n");
}
int main()
{

//(*p)是固定写法,代表指针变量p将来肯定是指向函数
//左边的void:指针变量p指向的函数没有返回值
//右边的():指针变量p指向的函数没有形参
void  (*p)();

//指针变量p指向了test函数
p=test;

(*p)();     //利用指针变量间接调用函数,p();也可以
test();     //直接调用函数

return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值