为什么用指针?

相信接触过编程的,大部分应该对C语言有一定了解或者学过一门C语言课程。或多或少听到这种说法:C语言很难学,特别是指针。我大一下学期开的这门课,学完之后感觉还好(其实是我没有深入学,典型的自我感觉良好: )),但指针那块确实也没太弄明白。现在好像明白了一点什么是指针,在什么情况下用比较好。

int a=1;//int* pointer_a=1 在编译会报错
// ‘initializing’:cannot convert from ‘int’ to ‘int *’
// 就是说初始化时,这两个不同类型的变量或值不能相互转换
//指针实际上就是内存地址,该地址的内存单元存储不同字节长度的数据

int* pointer_a=&a; //&操作符表示去地址

//这里pointer_a的值为变量a的地址
//当使用*操作时,*pointer_a取相应地址的内存单元里的值(*pointer_a)=1

a=2; //*pointer_a=2,由于pointer_a的值为变量a的地址,所以a的值改变 会影响(*pointer_a)的值
printf("%d\n",*pointer_a); //会输出2

1
2
3
4
5
6
7
8
9
10
11
12
13

指针有利于大块数据的管理,但也更危险。特别是已经存在于内存中的数据,通过指针访问更方便。 在一些情况下指针和数组的效果好象差不多。

char a,str[0x10]=“Hello World!”;//不用给每个字符取一个名称
char* pointer_str=str; //这里不会出现上面的错误,
printf(“string:%s\n”,pointer_str);//打印字符串

//反问字符串中的单个字符
a=(pointer_str+6); //a=‘W’
a=
(pointer_str+20); //这有没有什么问题呢?这个操作只是相当于读取,如果没有读到特殊的内存地址一般是没有问题的,a会被重新赋值。但是看看str数组的大小为16,现在读到了下标为20的单元,这是哪来的呢?虽然该数组只有(1*16bytes),但是内存都是连续的,它后面的内存里可能也有数据。如果是写操作问题可能就大了,改变了不属于它控制范围的环境,影响其他程序的运行。

1
2
3
4
5
6
7

一个函数的型参的类型该如何确定,到底用常规型还是指针型。如果1,对数据处理的改变要求保留时2,处理大块数据时,应该选指针型。

void sum(int a,int b) //计算a和b的和,并打印出来
{
printf(“sum of a and b:%d\n”,a+b);
}
//现在想要计算,并保存在第一个实参里
void sum_pointer(int* a,int b)
{
*a=*a+b;
//printf(“sum of a and b:%d\n”,*a+b);
}

int a=519;
sum(a,1);//打印520
printf(“a:%d “,a); //打印519
sum_pointer(&a,1); //打印520
printf(”%d\n”,a); //还是我爱你,对吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

//字符串或数据块
void encryption(int* str)
{
*(str+1)=2;
(str+2)=0;
}
int
str;
str=(int )malloc(3sizeof(int)); //给str申请一块自己的内存,不用再去借地盘,受别人的约束
*(str+0)=5;
*(str+1)=1;
(str+2)=9;
encryption(str);
printf(“str:%d%d%d\n”,str,(str+1),
(str+2));//打印520,数据的改变作用到内存,并保留下

作者:pureman_mega
来源:CSDN
原文:https://blog.csdn.net/pureman_mega/article/details/79558109
版权声明:本文为博主原创文章,转载请附上博文链接!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值