一、什么是指针
1.指针是存放另一个变量内存地址的变量
指针型变量的长度为4个字节,32位
2.宏定义NULL,表示0
良好的编程习惯:暂时不使用指针时,将其值设为NULL
3.指针定义后,若未被初始化,则其值为0xCCCCCCCC(Visual Studio中)
若访问此地址,则程序崩溃
4.指针作用:对主函数中实参变量值进行修改
例:void get(int *input) {
scanf(“%d”, input); //注意:不能写成&input
}
二、指针与数组
1.指针的加减运算以数据元素为单位,而不是字节
*(a + k)等价于a[k] &a[k]等价于a + k
2.指针与数组的区别:数组是有存储空间的,能够存储数据
指针只能用来存地址,没有存储空间
3.动态数组:例:Scores = (int *)malloc(num * sizeof(int));
if(Scores == NULL)
goto Error;
注意:malloc函数返回void类型空指针,故须强制类型转换
需加入错误处理
可使用数组下标法和指针法访问
静态数组存储于栈帧中,动态数组存储于堆中
4.动态数组使用后需使用free(…);释放
5.指针数组:例:void main(int argc, char *argv[])
argc:存放参数个数(包括程序名), argv中元素是基类型为字符的数组
6.指向指针的指针
例:void get(int **array) {
*array = (int *)malloc(count * sizeof(int));
…}
将主调函数中的地址,传到被调用的函数中,那么形参和实参均为指针
将被调用函数中的地址,传到主调函数中,那么形参和实参均为指向指针的指针(也可以采用函数返回值)
7.二维数组与指针
在C语言中存放一个二维数组时,并不会存放二维表格,而是顺序存放,即一个接着一个存放
a[i][j]:对应地址:a + k * sizeof(int),k = i * 每行元素个数 + j
a[i]:一维数组,例:a[0] + 1指向a[0][1]
a:指向固定长度的一维数组,每一步跨度为该数组长度,例:a + 1指向a[1]
8.若调用a[i][j]:
对一行操作:test1(a[i]); test1中参数:int *pa 或 int pa[] 或 int pa[4]
对数组操作:test2(a); test2中参数:int (*arr)[4] 或 int arr[][4] 或 int arr[3][4]
9.动态二维数组
例:a = (int (*)[4])malloc(nRows * nCols * sizeof(int));
三、指针与字符串
1.字符’ ’的ASCII码为0
注意:在定义字符数组时,须为’ ’预留一个数组元素的空间
2.如果用指针指向一个字符串常量,那么该指针中存放的是该字符串的首地址
3.数据段是编译器用来存放字符串常量的地方
程序员不需要申请或释放它,且字符串常量一般是只读的
4.字符串的访问:整个字符串:str 或 p(指针)
某个字符:str[i] 或 *(p + i)