19-指针的使用

本文详细介绍了指针在C语言中的应用场景,如交换变量值、返回多个值和异常处理。重点讲解了指针的常见错误,如未初始化就使用,以及指针与const的区分和使用技巧。此外,还讨论了如何通过const保护数组,防止函数内部修改。
摘要由CSDN通过智能技术生成

指针的应用场景

  • 交换两个变量的值
void swap(int *pa,int *pb)
{
	int t = *pa;
	*pa = *pb;
	*pb = t;
}
  • 当函数需要返回多个值,则必须通过指针带回,传入的参数实际上是需要保存带回的结果的变量
    eg:
#include <stdio.h>

void minmax(int a[], int len, int *max, int x*min);
int main(void)
{
	int a[] ={1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55,};
	int min,max;
	minmax(a, sizeof(a)/sizeof(a[0] ),&min,&max);
	printf ( "min=%d , malx=%d\n", min,max) ;
	return 0;
}
void minmax(int a[], int len, int *min,int *max)
{
	int i;
	*min =*max=a [0];
	for ( i=1; i<len; i++ ) {
	if ( a[i] <*min ) {
		*min = a[i];
	}
	if ( a[i]>*max ) {
		*max = a[i];
	}
}

  • 函数返回运算的状态,结果通过指针返回
    常用的套路是让函数返回特殊的不属于有效范围内的值来表示出错:
    ·-1或0(在文件操作会看到大量的例子)
    ·但是当任何数值都是有效的可能结果时,就得分开返回了
    之后的语言(C++,JAVA)采用了异常机制来解决这个问题

eg:

#include <stdio.h>
/**
@return如果除法成功,返回1;否则返回0
*/
int divide(int a, int b,int *result);
int main(void)
{
	int a=5;
	int b=2;
	int c;
	if ( divide(a,b,&c) ) {
		printf ( "%d /%d=%d\n", a, b,c);
	}
	return 0;
}
int divide(int a, int b, int *result)
{
	int ret = 1;
	if ( b == 0 ) ret = 0;else {
		*result = a/b;
	}
	return ret;
}

指针最常见的错误

  • 定义了指针变量,还没有指向任何变量,就开始使用指针
    eg:int *p;
    *p = 12;

这种写法是错误的,在定义*p后,p指向的地放不确定,若把12写入,但那个地方不能写入东西,此时程序会崩溃。

指针与const

  • 指针本身是const
    表示一旦得到了某个变量的地址,不能再指向其他变量
    int*const q = &i; //q是const
    *q= 26; //OK
    q++; //ERROR
  • 指针所指的值是const
    表示不能通过这个指针去修改那个变量(并不能使得那个变量成为const)
    const int*p = &i; <==> int const *p = &i
    *p = 26; // ERROR!§是const
    i = 26;//OK
    p = &j; //OK

判断哪个被const了的标志是const在*的前面还是后面

  • 转换
    总是可以把一个非const的值转换成const的
    void f(const int* x);
    int a = 15;
    f(&a); // ok
    const int b = a;
    f(&b); // ok
    b = a + 1; // Error !
    当要传递的参数的类型比地址大的时候,这是常用的手段:既能用比较少的字节数传递值给参数,又能避免函数对外面的变量的修改

const数组

  • const int a[ = {,2,3,4,5,6,};
  • 数组变量已经是const的指针了,这里的const表明数组的每个单元都是const int
  • 所以必须通过初始化进行赋值

保护数组

  • 因为把数组传入函数时传递的是地址,所以那个函数内部可以修改数组的值
  • 为了保护数组不被函数破坏,可以设置参数为const
  • int sum(const int a[], int length);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
结构体指针在 C 语言中非常常见和有用,可以通过指针来操作和访问结构体的成员。下面是一个简单的示例来说明如何使用结构体指针: ```c #include <stdio.h> // 定义一个结构体 struct Person { char name[20]; int age; }; int main() { // 声明一个结构体变量 struct Person person1; // 声明一个结构体指针 struct Person *personPtr; // 将结构体变量的地址赋值给结构体指针 personPtr = &person1; // 通过结构体指针来访问和修改结构体成员 printf("Enter name: "); scanf("%s", personPtr->name); printf("Enter age: "); scanf("%d", &personPtr->age); printf("Name: %s\n", personPtr->name); printf("Age: %d\n", personPtr->age); return 0; } ``` 在上面的代码中,我们定义了一个名为 `Person` 的结构体,其中包含了 `name` 和 `age` 两个成员。然后我们声明了一个 `Person` 类型的结构体变量 `person1`。接着,我们声明了一个 `Person` 类型的结构体指针 `personPtr`。 通过将结构体变量 `person1` 的地址赋值给结构体指针 `personPtr`,我们可以使用指针来访问和修改结构体成员。例如,我们使用 `personPtr->name` 来访问 `name` 成员,使用 `personPtr->age` 来访问 `age` 成员。 此外,我们还可以使用 `scanf` 函数从用户输入中读取数据,并通过结构体指针来修改结构体的成员。最后,我们使用结构体指针来打印出结构体的成员值。 希望这个示例能够帮助你理解结构体指针使用!如果有更多问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值