码迷,mamicode.com
首页 > 编程语言 > 详细

C语言指针

时间:2017-08-18 23:43:48      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:数组   函数调用   csdn   ansi   int   简单   数组名   一个   structure   

C语言指针

      指针是什么?

 

指针也是一个变量,但是这个变量存储的是一个地址,指向一个存储单元。我们可以根据指针(地址)找到他所指的变量,并对这个变量进行操作(赋值等)。通过C里面的取地址符号&和取所指内容的符号*可以很方便的表示指针以及指针所指的变量之间的关系

 

/*
 ============================================================================
 Name    C语言指针
 : text.c
 Author      : 
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */
#include <stdio.h>
#include <stdlib.h>
int main(void){
	int array[10] = {1,2,3};//定义数组
	int *p = array;      //取地址
	int *p2 = &array;     //取地址
	int *p3 = &array[0];    //取地址
	//三种指针效果相同
	printf("%d\n%d\n%d\n",p,p2,p3);


	//指针运算  需要根据指针的类型来运算
	int *p4 = (array+1);    //加1,单片机和电脑不一样,单片机加2,电脑是加4的。
	printf("%d\n",p4);
	int *p5 = (array+2);
	printf("%d\n",p5);

printf("-----------\n");
	double dd[10] = {1,2,3,4,5,6,7,8,9,10};
	printf("%d\n",dd);
	printf("%d\n",dd+1);    //地址加8
	printf("%d\n",dd+2);


}

 

 运行结果:

技术分享

二.为什么要用指针

正确而灵活的应用的指针,可以有效的表示复杂的数据结构;能够动态的分配内存;方便的使用字符串;有效而方便的使用数组;在调用函数时获得一个以上结果;能直接处理内存单元地址等

以上的概括应该算是比较完整的,但是对于初学C的人可能又会理解起来很抽象(可能都理解不了什么是数据结构);我们尝试从最简单的-----“在调用函数时获得一个以上结果来看看指针的作用。

 

1》值传递:C中在函数调用时始终采取值传递的方式。意思是这样的:并不是实参直接参与了函数(参加了函数内的各类操作),只是实参把他的值传递给形参去参与函数,完成函数内的操作(函数调用时形参被分配了内存,形参的值是实参的拷贝;但要明白,形参和实参不是一个变量,不占用相同的内存,形参发生变化了实参不一定变化。就好比三个变量abc执行了步骤:b=ab=c后,a不一定等于c

    1:请看下面的代码。代码是要实现两个数(ab)的交换,于是构造了交换函数swap;但是能完成目的吗

 

/*
 ============================================================================
 Name        : ww.c
 Author      : 
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>

void swap(int x,int y){
	int temp;
	temp=x;
	x=y;
	y=temp;
}
int main(){
	int a,b;
	a=1;
	b=0;
	swap(a,b);

	printf("%d %d",a,b);
}

 

 运行结果:

 技术分享

 

二:多维数组的情况。

 

这里,读者首先有个意识,多维数组每一维也都是一维数组。假设有个二维数组a[3][4],那么a[0],a[1],a[2]都是一个一维数组(他们是数组名,也是地址)。于是你能较为抽象的理解一下几个表示方法。

 

a                                   二维数组名,指向一维数组a[0],0行首地址

 

a+1, &a[1]                     一行首地址

 

*(a+1), a[1]                   一行零列元素地址

 

*(a+1)+2,a[1]+2             一行二列元素地址

 

*(*(a+1)+2), *(a[1]+2)    一行二列元素的值

 

上面这几个表示形式一定要注意,尤其是:a+1表示一行首地址,*a+1)表示

 

一行零列元素地址,虽然他们的值时相同的,但是他们是不同的,a+1+1表示二行首地址,而*a+1+1表示一行一列元素的地址。

/*
============================================================================
Name : ww.c
Author :
Version :
Copyright : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/

 

#include <stdio.h>

 

void main(){
int a[2][3]={1,2,3,4,5,6};
int *p=a[0];

 

for(;p<a[0]+6;p++)

 

printf("%d\n",*p);
}

结果:

技术分享

 

 

 

 

 

 

 

 

 

    

C语言指针

标签:数组   函数调用   csdn   ansi   int   简单   数组名   一个   structure   

原文地址:http://www.cnblogs.com/renhan1996/p/7392400.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!