`
birthdog
  • 浏览: 9517 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

C 语言笔记(2)

阅读更多
   今天写比较容易忘记的指针与数组。
(1)指针变量的定义:
   指针同样也是一类变量,和其他普通变量一样,具有值并且有一定的存储空间;它和普通变量不一样的是:存放在该空间内的值是另一个变量的地址,而那个变量是它所指向的目标。
   指针可以指向任何一种目标,包括简单型,构造型,无目标型,指针还可以指向函数,但在使用指针变量前必须先定义。
   指针的定义形式如下:
       存储类型说明:   数据类型  * 指针变量名;
   说明:
      a. 指针说明和一般变量说明语法相似,只是在变量之前都有 * 符号;
      b. 它后面的名字是指针变量名,指针变量名遵循 C 语言标识符命名规则;
      c. 指针的数据类型,是指针所指向的变量的数据类型,而不是指针自身的数据类型,指针变量本身只能装地址值,显然只
         属于整数范畴。
      d. C 语言中还有一种 "void *" 的指针变量,凡定义为"void *"的指针指向对象的类型不定,在使用前可临时赋值,强制
         转换成相应的对象类型。
(2)指针变量的初始化和赋值
      在使用指针前,必须使指针有一个明确的指向,通常的方法是初始化或赋值。
      指针变量在定义的同时,被赋予初值,称之为指针变量的初始化。指针变量初始化的一般形式为:
                 (存储类型说明) 类型名  *指针变量名 = 初始化地址;
      说明:
         a. 这里,赋值号前面的部分为指针的定义,在定义的同时立刻赋值;
         b. 初始地址值通常为如下形式: int a , *pa = &a;
         c. 初始地址值最好不要为具体的十六进制的整数,因为不知道该地址是否可用;
         d. 指针类型虽然可装整型数据,但是注意指针变量不能存放一般的整型数,这个数必须是合理、可用的内存地址。
            一个一般的整型数代表的地址未必合理,也未必可用,因为如果在代码区,会造成程序崩溃,而在 ROM 区则不
            可用。
         e. 可以把指针初始化为空指针。
(3)指针变量的引用
       取地址运算符 & 和指针运算符 * 是两个单目运算符,都位于运算符的优先级较高的第二级,结合方向为从右至左。
       A 取地址运算符 &
         例如: int i;  int *pi;
         &i 即为整数变量 i 的地址,可以赋给指向整型变量的指针变量 pi, 若执行语句如下:
              pi = &i;
           就是把整型变量 i 的地址放到pi 的存储单元中,若变量 i 的地址为 0xffdc,则 pi 的值也为 0xffdc。
        说明:
          a. 单目运算符 & 适用于整型、字符型、实型等简单变量和数组元素和结构体成员,但不能作用于常量和表达式;
          b. 对于寄存器变量,不可使用取地址运算符 &,因为寄存器变量存放于硬件寄存器中,不同于内存中定义的变量,
             没有地址的概念。
       B 指针运算符 *
         指针运算符 * 也是单目运算符。指针运算符的作用与 & 完全相反,是取地址运算符 & 的逆运算,它只能作用于变
         量的地址,并对其相应的存储区进行访问。
(4)指针与一维数组
     一维数组实际上是一个线性表,它被存放在一片连续的内存存储单元中。C 语言对数组的访问是通过数组名(数组的起始
     地址)加上相对于起始地址的相对量(数组元素下标),得到要访问的数组元素的存储单元地址,然后再对数组元素的内容
     进行访问。
     A. 引用数组元素的有三种形式:
         a. 下标法,如通过 a[i] 引用;
         b. 通过数组名计算数组元素的地址来引用数组元素,如 *(a+i);
         c. 利用指向数组的指针变量,如 *(pa+i) 或 pa[i]。
     B. 在程序的运行过程中通过赋值语句对数组赋值,也可采用指向数组元素的指针运算方法和下标方法:
         说明:
          a. 例如表达式 "*p++"表示先取 *p 的值,再使 p 指向下一元素,而表达式 "* ++ p"表示先使 p 加1;
          b. 要注意 *p++ 的含义相当于 *(p++) 而不是 (*p)++, 因为 (*p)++ 的含义是使 p 所指向的元素自加 1,而指
             针 p 的值并没有改变;
          c. 若 p 为指向数组 a 的第 i 个元素的指针,即 p 的值是数组元素 a[i] 的地址,则有如下对应关系:
                  a[i++] 相当于 *(p++)
                  a[i--] 相当于 *(p--)
                  a[++i] 相当于 *(++p)
                  a[--i] 相当于 *(--p)
(5)指针与二维数组
     动态定义一个二维数组
    
    #include"stdio.h"
#include"malloc.h"

void main()
{
	int m,n;
	scanf("%d%d",&m,&n); // m,n 分别为二维数组的行与列
	int **a;
	a = (int **)malloc(sizeof(int *)*m);
	for(int i=0;i<m;i++)   // 开辟数组空间
		*(a+i) = (int *)malloc(sizeof(int)*n);
	for(i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			a[i][j] = 1;
			printf("%d   ",a[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}
     

        

参考资料: C 语言程序设计基础教程 主编:潘志安 张月秋 蔡国辉 曾志

附件:_超越自己_.刘墉.扫描版.pdf
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics