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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值