C语言指针
我是搞java的,今年要找工作,参加笔试就必须要准备一些C/C++、算法、数据结构、操作系统、概率论的东西,浅谈一下我作为初学者对C指针的学习和理解。
一、*p 概念:
申明一个整形指针变量:
int * pi;
pi是一个指针,pi存的是地址编号的变量,若 int *pi = i; 则pi=&i;有下面等式:&(*pi)=pi;
例:
int a,*pa;
a=10;
pa=&a;
*pa=20;
printf( “%d”, a) //输出20;通过改变指针pa所指的内容来改变a的值,其实pa=&a;操作使pa和&a指向同一个内容。
二、指针和数组:
当一个指针变量被初始化成数组名时,就说该指针变量指向了数组。如:
char str[20], *ptr;
ptr=str; //ptr被置为数组str的第一个元素的地址(ptr=&str[0]),因为数组名就是该数组的首地址,也是数组第一个元素的地址。
此时可以认为指针ptr就是数组str(反之不成立),ptr为指向数组第一个元素的指针,值得注意的是:ptr是一个可以变化的指针变量,而str是一个常数,因为数组一经被说明,数组的地址也就是固定的,因此str是不能变化的,这样原来对数组的处理都可以用指针来实现。如对数组元素的访问,既可以用下标变量访问,也可以用指针访问。
以下代码的打印结果一样
int *pa,a[]={3,4,5,6,7,3,7,4,4,6};
for (int i=0;i<=9;i++)
{
printf ( “%d”, a[i] );
printf ( “%d”, *(a+i) );
printf(“%d”, pa[i] );
printf ( “%d”, *(pa+i) );
}
指针变量也可以指向多维数组,例如,在一个三维数组中,引用元素c[i][j][k]的地址计算最终将换成:*(*(*(c+i)+j)+k)。
若有如下说明:
int a[3][4];
int *p;
p=a;
p是指向整型变量的指针;p=a使p指向整型二维数组a的首地址。*(*(p+1)+2)表示取a[1][2]的内容;*p表示取a[0][0]的内容,因为p是指向整型变量的指针;p++表示p的内容加1,即p中存放的地址增加一个整型量的字节数2,从而使p指向下一个整型量a[0][1]。公式:a[j][k]等价于*(a+(j* row_length)+k)
三、指针常量:
int const * pi与int * const pi
int * const pi是将指针pi被定义为常量指针,
int const *pi == const int *pi是将指针pi所指的内容定义为常量
注意看如下代码:
int i1=30;
int i2=40;
int * const pi=&i1;
pi=&i2; //4.注意这里,代码不能编译成功,因为上一句指针pi被定义为了常量,不能再对pi赋值;
再看下面代码:
int i1=30;
int i2=40;
int const *pi=&i1;
pi=&i2; //注意这里,pi可以在任意时候重新赋值一个新内存地址
i2=80; //5.想想看:这里能用*pi=80;来代替吗?当然不能
printf( “%d”, *pi ) ; //6. 输出是80,但是不能通过*pi来改变i2了
补充:const int * const pi=&i;// pi值不能改,也不能通过pi修改i的值。因为不管是*pi还 是pi都是const的
此处有总结:
1) 如果const 修饰在*pi前则不能改的是*pi(即不能 类似这样:*pi=50;赋值)而不是指pi.
2) 如果const 是直接写在pi前则pi不能改(即不能类似 这样:pi=&i;赋值)。
四、值传递,地址传递,引用传递
看下面三个题目
1、值传递
void Exchg1(int x, int y)
{
int tmp;
tmp=x;
x=y;
y=tmp;
printf (“x=%d,y=%d\n”,x,y)
}
void main()
{
int a=4,b=6;
Exchg1 (a,b) ; //只是将a的值赋给x,b的值赋给y,并不能通过xy来改变ab的值;
printf(“a=%d,b=%d\n”,a,b)
}
输出的结果 :
x=6, y=4
a=4, b=6
2、地址传递
Exchg2(int *px, int *py)
{
int tmp=*px;
*px=*py;
*py=tmp;
print(“*px=%d,*py=%d\n”,*px,*py);
}
main()
{
int a=4;
int b=6;
Exchg2( &a,&b); //指针px,py的值已经分别是a,b变量的地址值了。接下来,对*px,*py的操作当然也就是对a,b变量本身的操作
Print (“a=%d,b=%d\n”, a, b);
}
*px=6, *py=4
a=6, b=4
3、引用传递
Exchg3(int &x, int &y) //注意定义
{
int tmp=x;
x=y;
y=tmp;
print(“x=%d,y=%d\n”,x,y);
}
main()
{
int a=4;
int b=6;
Exchg3(a,b); //Exchg3时函数会将a,b 分别代替了x,y了,我们称x,y分别引用了a,b变量
Print(“a=%d,b=%d\n”, a, b);
}
x=6, y=4
a=6, b=2
最后对值传递与引用传递作一个比较:
1. 在函数定义格式上有不同:
值传递在定义处是:Exchg1(int x, int y);
引用传递在这义处是:Exchg1(int &x, int &y);
2. 调用时有相同的格式:
值传递:Exchg1(a,b);
引用传递:Exchg3(a,b);
3. 功能上是不同的:
值传递的函数里操作的不是a,b变量本身,只是将a,b值赋给了x,y函数里操作的只是x,y变量而不是a,b,显示a,b的值不会被Exchg1函数所修改。
引用传递Exchg3(a,b)函数里是用a,b分别代替了x,y。函数里操作的是a,b。
C语言指针的更多相关文章
- C语言指针转换为intptr_t类型
1.前言 今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量.由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针.感觉很奇怪,为何要将一个指针 ...
- [转]C语言指针学习经验总结浅谈
指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...
- 不可或缺 Windows Native (7) - C 语言: 指针
[源码下载] 不可或缺 Windows Native (7) - C 语言: 指针 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #i ...
- C语言指针学习
C语言学过好久了,对于其中的指针却没有非常明确的认识,趁着有机会来好好学习一下,总结一下学过的知识,知识来自C语言指针详解一文 一:指针的概念 指针是一个特殊的变量,里面存储的数值是内存里的一个地址. ...
- (转载)c语言指针学习
前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水, ...
- 关于C语言指针的问题
在学习关于C语言指针的时候,发现这样一个问题,代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h&g ...
- C语言指针类型 强制转换
关于C语言指针类型 强制转换 引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...
- C语言指针和数组知识总结(上)
C语言指针和数组知识总结(上) 一.指针的基础 1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是: %08x 2.指针的本质 指针的本质就是变量,那么既然是变量,那么一定会分配地址 ...
- C语言指针操作
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/pointer-manipulation. ...
- C语言指针声明探秘
C语言指针声明探秘
随机推荐
- Saving changes is not permitted in SQL Server
From Save (Not Permitted) Dialog Box on MSDN : The Save (Not Permitted) dialog box warns you that sa ...
- RDIFramework.NET V2.9版本多语言的实现
RDIFramework.NET V2.9版本多语言的实现 现在是国际化时代,软件也不能落后.一个公司里很可能会有老外,也可能有台湾的朋友,他们用软件的习惯都不一样,若同样一个软件同时能适应多种语言文 ...
- Java基础之在窗口中绘图——利用多态性使用鼠标自由绘图(Sketcher 7 with a crosshair cursor)
控制台程序. 在Sketcher中创建形状时,并不知道应该以什么顺序创建不同类型的形状,这完全取决于使用Sketcher程序生成草图的人.因此需要绘制形状,对它们执行其他操作而不必知道图形是什么.当然 ...
- 在CentOS 7上安装Node.js的4种方法
一.源码安装 1.下载源码(官网查看最新版本链接) wget http://nodejs.org/dist/v0.10.30/node-v0.10.30.tar.gz 2.解压源码 tar xzvf ...
- 记录一下我使用的vim的配置文件
还不是很完美: "au BufReadPost * if line("'\"") > 0|if line("'\"") &l ...
- win api 实现 AES加密、解密
WCHAR szPasswod[] = {L"goodpasswod" }; HCRYPTHASH hHash; HCRYPTPROV hCryptProv; HCRYPTKEY ...
- Jenkins入门系列之——01第一章 Jenkins是什么?
第一章 Jenkins是什么? Jenkins 是一个可扩展的持续集成引擎. 主要用于: l 持续.自动地构建/测试软件项目. l 监控一些定时执行的任务. Jenkins拥有的特性包括: l 易于安 ...
- sudo service docker start
sudo service docker start sudo docker run -t -i ubuntu:14.04 /bin/bash docker ps -l CONTAINER ID IMA ...
- 在虚拟机发布网站,设置服务器外网访问ip端口号
这是虚机上的发布网站的网站端口号 这一步要在实机设置 做完这一步,在外网就可以访问你刚刚发布的站点了
- 理解GRUB2工作原理及配置选项与方法
GRUB2是借鉴GRUB改写到更加安全强大到多系统引导程序,现在大部分较新的Linux发行版都是使用GRUB2作为引导程序的.GRUB2采用了模块化设计,使得GRUB2核心更加精炼,使用更加灵活,同时 ...