您的位置:首页 > 编程语言 > C语言/C++

重拾c语言——指针与数组

2016-03-05 12:36 288 查看
全局变量:

int x,y;

int main()

{

...

}

double a,b;

int f1()

{

...

}

void f2()

{

...

}

//x,y和a,b都是全局变量,不同的是a,b的作用域在f1和f2,而x,y的作用域在所有函数中;

//如果想要在main中使用a,b。则在main函数中可以加入extern double a,b;之后才可以使用;--外部变量的声明,扩展其作用范围

//全局变量给函数的使用带来不安全性,建议少用

//当全局变量和局部变量同名时,在函数中把全局变量暂时隐藏起来,局部变量起作用;

//无论是全局变量还是局部变量,其定义和初始化都在程序编译时进行;

变量的存储类型:

auto :以动态存储方式分配存储空间,都是局部变量,数据存储在动态存储区中

比如函数的形参和在函数中定义的变量

static :静态变量,根据变量的类型可以分为静态局部变量和静态全局变量

(1)静态局部变量:数据存储在静态存储区,与局部变量的区别在于函数退出时,变量始终存在,但不能被其他函数使用,当再次进入函数时,将保存上一次的结果,其他与局部变量一样;

(2)静态全局变量:和全局变量的区别在于全局变量可以说明为外部变量(extern),被其他源文件使用,而静态全局变量确不能再说明为外部的,只能被所在的源文件中使用;

register:寄存器变量,register变量不能是全局变量和静态局部变量,只能是auto变量

内部函数:使用static指定函数不能被其他文件调用

使用内部函数可以使函数的作用域只局限于所在的文件,而与其他文件中的同名函数互不干扰,这样可以不用为了函数名字是否相同而担心

外部函数; c语言中在函数定义的前面加上extern关键字而说明的函数,一般如果定义时省略extern,隐含为外部函数

数组:

数组初始化:int digits[ ]={0,1.2.3.4.5};

错误写法:int digits[10];

digits={0,1,2,3,4,5};

*如果不想在函数中改变实参数组的值,可以使用const关键字修饰形参数组,这样就可以避免函数在操作数组时发生值改变的意外情形

eg. int sum(const int a[],int n)//形参数组被限定为const,在函数中不能改变数组元素的值

{

int i,sum_a=0;

for(i=0;i<n;i++)

sum_a+=a[i];

return sum_a;

}

scanf:当读到有空格符,换行符或制表符时,停止读入,同时scanf函数将空字符\0存入数组参数中的字符串末尾处

eg.scanf("%s",str);//如果只是这样写,那么如果str为I love you那么只能输出I

可以用gets()和puts()代替;或者参考http://blog.csdn.net/kobesdu/article/details/39051399的解决办法(此篇文必读啊)

字符数组和字符串:

字符数组和字符串是有区别的,字符串是字符数组的一种特殊形式,存储时以'\0'结束。所以,存放字符串的字符数组应该比字符串大1.

而字符数组如果没有加'\0'结束标志,只能按逐个字符输入输出。什么意思呢?看下面的例子:

int main()

{

char str[10],*p=str;

int i;

scanf("%s",str); //输入的字符串,长度超过10

for(i=0;i<10;i++)

printf("%c",*p++);

printf("\n");

p=str;

printf("%s",p);//字符数组无'\0'标志,输出出错

puts(str); //字符数组无'\0'标志,输出出错

return 0;

}

指针和数组:

若ptr指向了一维数组,在c语言中,可以用指针的间接访问形式对数组进行访问:

(1)ptr+n与a+n表示数组的a
元素的地址,即&a
;

(2)间接访问*(ptr+n)和*(a+n)就表示为数组各元素即等效于a
;

(3)指向数组的指针变量也可以用数组的下标形式表示为ptr
,效果和*(ptr)相等

总结:

访问数组元素的地址:&a[i] a+i p+i

访问数组元素 :a[i] *(a+i) *(p+i) p[i]

注意:printf("%4d",*p++)指的是先输出指针指向的变量的值,然后指针变量再加1

访问二维数组的地址:&a[i][j] a[i]+j *(a+i)+j 表示第i行第j列的地址

访问二维数组的元素: a[i][j] *(a[i]+j) *(*(a+i)+j)

指针数组和数组指针:

指针数组为存放指针的数组,例如:char *str[4]; [ ]的优先级比*高,所以表示数组中有4个元素,每个元素都是一个指向字符数据的指针

数组指针为指向数组首地址的指针,例如:char (*str)[4];

函数与指针:

int f(); f为返回整型数的函数

int *p(); p为返回指针的函数,该指针指向一个整型数

int (*p)(); p为指向函数的指针变量,该函数返回整型数

int **p; p为指针变量,它指向一个指向整型数据的指针变量

指向结构体变量的指针:

以下三种形式等价:结构体变量.成员名 (*p).成员名 p->成员名
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: