复杂指针

/*
数组指针和指针数组 []优先级高于*
①数组指针—本身是指针,表示该指针指向一个数组
int(p)[5]; //表示指针变量p指向一个大小为5的一维数组
②指针数组—本身所示数组,表示该数组里面存放的是指针
int p[5]; //表示大小为5的一维数组里面存放了5个整形指针变量
/
/

int ar[3][5],i,j;
int(p)[5]; //表示p指向一个大小为5的一维数组
p = &ar[0]; //将二维数组的第1行首地址赋给p,此时p+i代表第i+1行的首地址,p++代表指向第二行的地址
//此时p++代表指向第二行第一个元素
//
((p+i)+j)表示第i+1行第j+1列元素的地址
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++) //
(ar[i]+j)表示第i+1行第j+1个元素的值
{ //ar[i]+j表示第i+1行第j+1个元素的地址
scanf_s("%d ", ((p+i)+j)); //为二维数组赋初值,因为p指向大小为5的一维数组,类似于(ar[i]+j)
}
}
//输出第三行元素
p = &ar[2]; //将二维数组第三行的首地址赋给p
//p=&ar[n];
((*p)+j)表示第n+1行的第j+1个元素
for (j = 0; j < 5; j++)
{
printf("%d", *((*p) + j)); //输出第三行所有元素
}
/
/

ar+n代表第n+1行的首地址,类似于p=&ar[n]代表第n+1行的首地址
*(ar+i)+j代表第i+1行第j+1列元素的地址
((ar+n)+j)代表第n+1行第j+1列元素的值
(ar[i]+j)代表第n+1行第j+1列元素的值
用指针引用二维数组,其中
(ar+i)和ar[i]是等价的
int ar[3][5],i,j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
scanf_s("%d “, *(ar+ i) + j);
}
}
for (j = 0; j < 5; j++)
{
printf(”%d “, ((ar + 1) + j));
}
/
/

①函数指针—本身是指针变量,该指针指向这个函数,包含了函数的地址 格式为 返回值类型(*指针变量名)(参数列表)
void fun(int x, int y);
void fun(int x, int y)
{
int z;
z = x + y;
printf(”%d\n", z);
}
int main()
{
void(*f) (int x, int y); //函数指针,表示指针变量f指向某个函数
f = fun; //使指针变量f指向该函数
printf("%d\n", f); //f是指向函数的指针变量,输出为函数入口的地址
//用函数名调用此函数
fun(2, 3); //输出结果5
//用指针调用此函数
(*f)(5, 6); //输出结果11
system(“pause”);
return 0;
}
/
/

②指针函数—本身是函数,该函数返回值为指针值,调用后得到一个指定类型的指针,一般形式为 类型名 * 函数名(参数列表)
int result;
int * fun(int a, int b)
{
int *p;
p = &result;
result = a * b;
printf("%d\n", p); //返回一个地址,为函数的入口地址
return p;
}
int main()
{
int *q;
q=fun(2, 3); //用指针变量q调用此指针函数
printf("%d", q); //返回一个地址和指针p的地址相等
system(“pause”);
return 0;
}
/
/

//指针变量做函数参数—调用函数不能改变指针变量的值,也就是地址不变,只能改变指向变量的值
void swap(int *a, int *b) //交换函数—用指针变量交换两个数的值
{
int t;
t = *a;
*a = *b; //只是交换指针变量指向变量的值,本身的值,也就是地址并没有改变
*b = t;
}
int main()
{
int x, y;
int *p_x, *p_y;
printf(“请输入两个数:\n”);
scanf_s("%d", &x);
scanf_s("%d", &y);
p_x = &x; //让p_x指针指向x
p_y = &y; //让p_y指针指向y
swap(p_x, p_y);
printf(“x=%d\n”, x);
printf(“y=%d\n”, y);
system(“pause”);
return 0;
}
/
/

//指针数组做main函数的参数
void main(int argc, char *argv[])
{
printf(“命令名: %s\n”, *argv);
printf(“参数个数: %d\n”, argc);
system(“pause”);
}
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值