一、字符指针
在指针类型中有一种指针类型为字符指针 char* ;
使用
int main () { char ch = 'w' ; char * pc = & ch ; * pc = 'w' ; return 0 ; }
int main () { const char* pstr = "hello bit." ; //把一个字符串首字符h的地址放到pstr指针变量中 printf ( "%s\n" , pstr ); return 0 ; }
二、指针数组
指针数组是一个存放指针的数组。
int* arr1 [ 10 ]; //整形指针的数组 char *arr2[4]; //一级字符指针的数组 char **arr3[5]; //二级字符指针的数组
三、数组指针
3.1 数组指针的定义
整形指针: int * pint; 指向整形数据的指针。
浮点型指针: float * pf; 指向浮点型数据的指针。
数组指针应该是:指向数组的指针或存放数组地址的指针变量。形如int (*p1)[10];
3.2 数组名和&数组名
int arr[10];
arr是数组名,也是数组首元素的地址,而&arr是数组的地址,不是首元素的地址。arr+1是数组中相应的下一个元素,&arr+1是数组的地址+1,跳过整个数组的大小。
3.3 数组指针的使用
数组指针中存放的是数组的地址,多用于二维数组。
<stdio.h> void print_arr1 ( int arr [ 3 ][ 5 ], int row , int col ) { int i = 0 ; for ( i = 0 ; i < row ; i ++ ) { for ( j = 0 ; j < col ; j ++ ) { printf ( "%d " , arr [ i ][ j ]); } printf ( "\n" ); } void print_arr2 ( int ( * arr )[ 5 ], int row , int col ) { int i = 0 ; for ( i = 0 ; i < row ; i ++ ) { for ( j = 0 ; j < col ; j ++ ) { printf ( "%d " , arr [ i ][ j ]); } printf ( "\n" ); } } int main () { int arr [ 3 ][ 5 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }; print_arr1 ( arr , 3 , 5 ); //数组名arr,表示首元素的地址,但是二维数组的首元素是二维数组的第一行 //所以这里传递的arr,其实相当于第一行的地址,是一维数组的地址 //可以数组指针来接收 print_arr2 ( arr , 3 , 5 ); return 0 ; } }
四、数组参数、指针参数
数组参数或指针参数是将数组或指针传递给函数。
4.1 一维数组传参
一维数组传参,形参可以是数组,也可以是指针。
void test1(int arr[5], int sz) {} void test2(int* p, int sz) {} int main() { int arr[5] = { 0 }; test1(arr, 5); test2(arr, 5); return 0; }
4.2 二维数组传参
二维数组传参,形参的部分可以是数组,也可以是指针。
void test3(char arr[3][5], int r, int c) {} void test4(char (*p)[5], int r, int c) {} int main() { char arr[3][5] = {0}; test3(arr, 3, 5); test4(arr, 3, 5); return 0; }
注意:二维数组传参,形参中行可以省略,列不可以省略,可以传递一级指针的数组指针 int(*arr)[5],不能传递一级指针数组int *arr[5],不能传递二 级指针int ** arr。
4.3 一级指针传参
#include <stdio.h> void print ( int * p , int sz ) { int i = 0 ; for ( i = 0 ; i < sz ; i ++ ) { printf ( "%d\n" , * ( p + i )); } } int main () { int arr [ 10 ] = { 1 , 2 , 3 , 4 , 5 }; int * p = arr ; int sz = sizeof ( arr ) / sizeof ( arr [ 0 ]); //一级指针p,传给函数 print ( p , sz ); return 0 ; }
4.4二级指针传参
#include <stdio.h> void test ( int** ptr ) { printf ( "num = %d\n", **ptr); } int main () { int n = 10 ; int* p = & n ; int ** pp = & p ; test ( pp ); test ( & p ); return 0 ; }
五、函数指针
#include <stdio.h> void test () { printf ( "helloe\n" ); } int main () { printf ( "%p\n" , test ); printf ( "%p\n" , & test ); return 0 ; }
输出结果为:
若要保存函数的地址,需用指针
void (*pfun1)();
pfun1先和*结合,则pfun1是指针,指针指向一个函数,指向的函数无参数,返回值类型 为void。