标签:数组 函数调用 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中在函数调用时始终采取“值传递”的方式。意思是这样的:并不是实参直接参与了函数(参加了函数内的各类操作),只是实参把他的值传递给形参去参与函数,完成函数内的操作(函数调用时形参被分配了内存,形参的值是实参的拷贝;但要明白,形参和实参不是一个变量,不占用相同的内存,形参发生变化了实参不一定变化。就好比三个变量a,b,c执行了步骤:b=a;b=c后,a不一定等于c)
例1:请看下面的代码。代码是要实现两个数(a,b)的交换,于是构造了交换函数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);
}
结果:
标签:数组 函数调用 csdn ansi int 简单 数组名 一个 structure
原文地址:http://www.cnblogs.com/renhan1996/p/7392400.html