IOS学习---C语言基础学习7(指针)

指针:
格式:变量类型 *变量名;
定义一个指针变量p  int *p;
指针变量只能存储地址
p = &a 
指针的作用:
  跟狗根据一个地址值,访问对应的存储空间
指针变量p前面的int:指针变量p只能指向int类型的数据

注意:
不建议下述写法
1、
int  *p;
double d = 10.0;
p=&d;
int *p只能指向int类型的数据
2、
int *p;
p = 200;
指针变量只能存储地址
3、int *p;
printf("%d",*p)
指针未经过初始化,不要拿来间接访问其他存储空间
4、
int *p = &a;正确
int *p; *p = &a; 错误 int *p; p=&a;正确
原因:定义指针时 int *p = &a;可以理解为 (int *)p = a;
只是为了说明p是一个整型的指针类型变量
注意:
int *p;定义变量时的*仅仅是一个象征,没有其他特殊含义
*p=a;这个时候*的作用:访问指针变量p指向的存储空间

指向指针的指针:
格式:
int a =10;
int *p = &a;
int **pp = &p;((int *)*p = &p)指向指针的指针

指向任何类型的指针都占用8个字节,为什么指针还要分类型呢?

原因:
输出值:
int i =2;                     int i =2; 
char c =1;                    char c =1;

char *p;                      int *p;
p=&c;                         p=&c;

printf("d%",*p);            printf("d%",*p)

输出结果是: 1                输出结果为513
取值:
int i = 2;
char c = 1;

int *p;
p=&c;

*p=10;
printf("%d",*p);   取出数据错误
原因:由于 *p为int 类型 默认为四个字节 
*p = 10; 将10的值赋给p指向的地址
而 p指向的地址为char值得问题

原因:内存中的存储,i(4个字节),c(1个字节) 二者相邻
int *p;p=&c 表示 指针p指向变量c的地址
由于 i为整型,所以默认要从首地址c开始向后取四个字节
因此取到了非变量c的值。因此 指针类型的定义时很有必要的否则可能造成取出的数据不是想要的

指针与数组:
int ages[5]={1,2,3,4,5};
int *p;
p=ages[0];//或者p=ages  数组名表示数组的起始地址,表示数组的第一个元素的地址
printf("%d",*p);
for(int i= 0 ;i< 5;i++)
{
printf("ages[%d] = %d",i,*(p+i));
}
数组元素的访问方式:
1、数组名[下标] ages[0]
2、利用指针变量名[下标] p[1]
3、*(p+i)
指针变量的+1,究竟加多少,取决于指针的类型
若为 int*   +4    char* +1   double *   +8

地址传递,不一定要从首地址开始
change(&ages[2]);
传递的是ages[2]的地址

指针与字符串
char *name2 = "it";
指针变量name2指向了字符串的首字符
printf("%s\n",name2) 输出结果为 it
"%s" 从name2开始输出字符串 直到遇到\0为止

字符串定义的两种方式:
1、利用数组
char name[] = "it"
可以通过 name[0] = T;进行更改
适用场合:字符串的内容需要经常修改
2、利用指针
char *name = "it";
*name = 'T' 错误  不可进行更改
原因:字符串其实是一个常量字符串,里面的字符不能修改
根本原因:在内存中的存放地址不同,第一种存放于变量区,第二种存放于常量区
使用场合:字符串的内容不需要修改,而且这个字符串经常使用
内存:
1、常量区
存放常量字符串
2、堆
对象
3、栈
存放局部变量

字符串数组存放方法
指针数组:
char *names[5] = {"jack","rose","lee"};
二维字符数组
char name1[2][10] = {"jack","rose","lee"};

字符串输入:

char name[20];
scanf("%s",name);
name为数组的首地址,‘%s’的存入时表示从首地址开始直到遇见‘\0’结束

返回指针的函数:
char *test()
{
return "rose";//返回“rose”的首地址
}
int main()
{
char *name = test();
printf("%s",name);
}

指向函数的指针:
void test()
{
printf("调用了test函数");
}

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

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

p();//也可以调用test函数

(*p)();//利用指针变量间接调用test函数

test();//直接调用函数;

return 0;
}

int sum(int a,int b)
{
return a+b;
}

int main()
{
定义指针变量指向sum
//左边int:指针变量p指向的函数返回int类型数据
//右边的(int,int):指针变量p指向的函数有2个 //int类型的形参
int(*p)(int ,int );
p=sum;
int c = p(10,11);//调用函数法1
int c = (*p)(10,11);//调用函数方法2
int c =sum(10,11);//调用函数方法3
}

要求:
掌握:
1、看懂语法
2、定义指向函数的指针 
    double (*p)(double char*,int); p = sum;
    或者
    double(*p)(double,char*,int) = sum;
3、如何间接调用函数
   1、p();
   2、(*p)();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值