承接上文C语言指针(一),链接为:C语言指针(一)
一、多级指针 1.1 多级指针的定义及应用把一个指向指针的变量称为多级指针变量,常用二级指针,其实二级指针都用的不太多。
二级指针变量说明形式:<存储类型> <数据类型> **<指针名> 例如: char **q;
示例程序如下:
#include1.2 多级指针的运算int main(int argc , char **argv) { int m = 100; int *p = &m; int **q = &p; printf("m = %d &m = %p p = %p &p = %pn q = %p &q = %p *q = %p **q = %dn", m , &m , p , &p , q, &q , *q , **q); return 0; }
多级指针运算也是以其目标变量为单位进行偏移,比如int* p ,p+1是移动一个int变量占用的内存空间,int **p , p+1就是移动一个int *变量占用的内存空间 , int ***p , p+1就是移动一个int **所占的内存空间。代码演示如下:
#includeint main(int argc , char **argv) { int m = 100; int *p = &m; int **q = &p; printf("q = %p &q = %p *q = %p **q = %dn" , q , &q , *q , **q); printf("q+1 = %p sizeof(q) = %ldn" ,q+1 , sizeof(q)); return 0; }
可以看出q+1比q大了8个字节,多级指针+1,就是移动一个指针变量,不管是几级指针,都是存储内存编号(地址),在64位机器上,占8字节,因此多级变量指针本身也是占用8字节,所以多级指针偏移以8字节为单位。
指针数组的定义:
指针数组是指由若干个指针构成的集合,指针数组一般形式为:<存储类型> <数据类型> *<指针数组名>[<大小>],例如:int p[2]
缘由是[]优先级比高,p先和[]结合形成数组,然后数组的每个元素都是指针变量。指针数组名就是指针数组的储存首地址,即指针数组名为数组的指针。
指针数组的初始化:
声明一个指针数组: double * pa[2] ,a[2][3];
把一维数组a[0]和a[1]的首地址分别赋予指针变量数组的数组元数pa[0]和pa[1]:
pa[0]=a[0] ; // 等价pa[0] = &a[0][0];
pa[1]=a[1]; // 等价pa[1] = &a[1][0];
此时pa[0]指向了一维数组a[0]的第一个元素a[0][0], 而pa[1]指向了一维数组a[1]的第一个元素a[1][0]。,如下图所示:
概念:void指针是一种不确定数据类型的指针变量,它可以通过强制类型转换让该变量指向任何数据类型的变量。
一般形式:void * <指针变量名称> ;
对于void指针,在没有强制类型转换之前,不能进行任何指针的算术运算。如下程序所示:(printf里,如果不做转换,由于void的p读取字节不定,没法取值。)
#include3.2 const与指针int main(int argc, char const *argv[]) { void *p; int a = 10; p = (void *)&a; printf("%dn", *(int *)p); //如果不做转换,由于void的p读取字节不定,没法取值 return 0; }
在C语言中,关键字const修饰变量,可以使得变量常量化。const修饰基本简单类型(非指针)时,很容易理解,就是变量的值不允许被修改,下面两种写法均可:
const int m = 10; int const m = 10;
若要用const修饰指针,由于const放置的位置不同,修饰的内容也不同,主要是如下三种情况:
1、常量化指针目标表达式
一般说明形式:const <数据类型> * <指针变量名称>[= <指针运算表达式>] ;
例如:int m = 100 ;const int p = &m; //此时p的值不可被修改,但是p指向的位置可以移动。如下演示:
#includeint main(int argc, char const *argv[]) { int m = 100; const int *p = &m; *p = 101; return 0; }
#includeint main(int argc, char const *argv[]) { int m = 100; const int *p = &m; / #include int main(int argc, char const *argv[]) { int m = 100; int* const p = &m; *p = 101; return 0; }
#include4.4 字符指针数组int main(int argc, char const *argv[]) { int m = 100; int* const p = &m; / #include #include #include int main(int argc, char *argv[]) { char str[] = "Ation"; char *p = str; for(int i = 0;i if(isalpha(*p)) { if(isupper(*p)) { *p = tolower(*p); //大写变小写 } else { *p = toupper(*p); //小写变大写 } } p++; } p = str; printf("%s %sn",str,p); return 0; }
若数组中存储若干个字符串的地址,则该数组叫做字符指针数组。形式:char *a[3];
示例程序如下:
#include四、综合练习#include int main(int argc, char const *argv[]) { char s1[] = "welcome"; char s2[] = "to"; char s3[] = "jiangxi"; char *a1[3] = {s1, s2, s3}; char *a2[3] = {"welcome", "to" , "jiangxi"}; char **p = a1; int i = 0; printf("array1:%s %s %sn", a1[0], a1[1], a1[2]); for (i = 0; i < sizeof(a1)/sizeof(char *); i++) printf("%s ", *(p+i)); printf("n"); p = a2; printf("array2:%s %s %sn", a2[0] , a2[1] , a2[2]); for (i = 0; i < sizeof(a2)/sizeof(char *); i++) printf("%s ", *(p+i)); printf("n"); return 0; }
1、不使用strcat连接函数,用指针编程实现字符串连接功能。
#include#include #include int main(int argc, char *argv[]) { char dest[256] = "attion"; char src[256] = "please"; char *p = dest; char *q = src; int qlen = strlen(q); int plen = strlen(dest); while (*q != ' ') { for (int i = 0; i < qlen; i++) { *(p+plen) = *q; p++; q++; } } printf("dest: %snsrc: %sn", dest, src); return 0; }
2、用指针编程实现字符串反转功能。
#include#include int main(int argc, char *argv[]) { char string[100] = "please"; char *p = string; char *q = string + strlen(string) -1; char temp = 0; while (p < q) { temp = *q; *q = *p; *p =temp; p++; q--; } printf("string: %sn", string); }
3、利用指针数组处理一个二维数组,要求求出二维数组所有元素的和
答:
#includeint main(int argc, char *argv[]) { int a[2][3] = {0}; int *p[2] = {a[0],a[1]}; int i = 0 ,j = 0; int sum = 0; for(i = 0;i<2; i++) { for(j = 0;j < 3;j++) { scanf("%d",&a[i][j]); } } for(i = 0; i < 2 ; i++ ) { for(j = 0; j < 3 ; j++) { printf("%d ",a[i][j]); sum += *(p[i]+j); } putchar('n'); } printf("%dn",sum); return 0; }
4、用指针写出strcmp函数
答:
#includeint main(int argc,char *argv[]) { char str1[100]; char str2[100]; char *p = str1; char *q = str2; char temp; puts("please input the first str:"); gets(p); puts("please input the second str:"); gets(q); while(*p == *q) { if(*p == ' ') break; p++; q++; } temp = *q - *p; printf("the cmp return val is %dn",temp); return 0; }
5、利用指针实现strncmp函数功能
答:
#includeint my_strncmp(char *p,char *q,int n); int main(int argc,char *argv[]) { char str1[100]; char str2[100]; char *p = str1; char *q = str2; char temp = 0; //char test = 0; puts("please input the first str:"); gets(p); puts("please input the second str:"); gets(q); //temp = strncmp(p,q,5); //用于测试 temp = my_strncmp(p,q,5); //比较前5个字符 printf("the cmp return val is %dn",temp); return 0; } //比较两个字符串的前n个字符 int my_strncmp(char *p, char *q, int n) { int i = 0; for(i = 0;i < n-1;i++) { if(*p == *q) { if(*p == ' ') break; } p++; q++; } return *p - *q; }



