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

全局变量:
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[n]元素的地址,即&a[n];
(2)间接访问*(ptr+n)和*(a+n)就表示为数组各元素即等效于a[n];
 (3)指向数组的指针变量也可以用数组的下标形式表示为ptr[n],效果和*(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->成员名
          
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值