重拾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->成员名
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->成员名
相关文章推荐
- POJ1190
- C语言解释器的实现--序(零)
- C++ 17 的最新动态
- C++容器详解
- C语言调用动态库中的函数的方法(dlopen,dlsym等)
- c语言概述
- vs2013 c++項目轉 vs2008
- C/C++ 声卡编程代码
- C++类的静态成员(static members in classes)
- C++拷贝构造函数
- 堆排序的c++实现代码
- C++中值传递、指针传递、引用传递
- C++学习笔记:异常的基本语法
- C语言易错的优先级
- 比较大数的大小(10**6) c++ python
- 双向链表(c++实现)
- /c++赋值运算符为什么要返回引用
- 条款二:最好使用c++转型操作符
- C++编译器与链接器的工作原理
- CSV文件的使用-写入/写出(C++/Python)