(七)指针数组
概念:一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素相当于一个指针变量。
一维指针数组的定义形式为:
类型名 *数组名[数组长度];
例如:
int *name[4];
由下图可知:
-
程序前两句和第三句相等。
-
指针数组元素的的值为数组中元素的值的首地址。
如:指针数组pa1的第0个元素pa1[0]的值为0x0018fef0,指向数组stra[0]的首地址。
用例:将字符串按字母排序(由小到大)输出。#include <stdio.h> #include <string.h> void main() { void sort(char *array[], int n); void print(char *array[], int n); char *name[] = {"Hello world", "hello world", "hello", "china"}; sort(name, 4); print(name, 4); } void sort(char *array[], int n) { int i, j, m; char *temp; for(i = 0; i < n; i++){ for(j = i + 1; j < n; j++){ m = strcmp(array[i], array[j]);//以ASCII码的大小进行对比 if(m == 1){ //非0为真 temp = array[i]; array[i] = array[j]; array[j] = temp; } } } } void print(char *array[], int n) { int i; for(i = 0; i < n; i++){ printf("%s\n", array[i]); } }
(八)指向指针的指针
概念:如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。
定义一个指向指针型数据的指针变量:
char **p;
p前面有两个*号,表示指针变量p是指向一个字符指针型变量的。
用例:(直接给pptr=&var其实也是可以的)
int main ()
{
int var;
int *ptr;
int **pptr;
var = 3000;
/* 获取 var 的地址 */
ptr = &var;
/* 使用运算符 & 获取 ptr 的地址 */
pptr = &ptr;
/* 使用 pptr 获取值 */
printf("Value of var = %d\n", var );
printf("Value available at *ptr = %d\n", *ptr );
printf("Value available at **pptr = %d\n", **pptr);
return 0;
}
(九)main函数的参数
习惯上main函数这两个参数写为 argc (整型变量)和 argv (指向字符串的指针数组)。
main函数的函数头应写为:
main (int argc,char *argv[])
argc参数表示了命令行中参数的个数(注意:文件名本身也算一个参数),argc的值是在输入命令行时由系统按实际参数的个数自动赋予的。
argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。
用例:
#include <stdio.h>
void main(int argc, char *argv[])
{
printf("%d\t",argc);
while(argc--){
printf("%s\t", argv[argc]);
}
printf("\n");
}
(十)main函数的参数有关指针的数据类型和指针运算的小结
1.有关指针的数据类型的小结
定义 | 含义 |
---|---|
int i | 定义整型变量i |
int *p | p为指向整型数据的指针变量 |
int a[n] | 定义整型数组a,它有n个元素 |
int *p[n] | 定义指针数组p,它由n个指向整型数据的指针元素组成 |
int (*p)[n] | p为指向n个元素的一维数组的指针变量 |
int f() | f为带回整型函数值的函数 |
int *p() | p为带回一个指针的函数,该指针指向整型数据 |
int (*p)() | p为指向函数的指针,该函数返回一个整型值 |
int **p | p是一个指针变量,它指向一个指向整型数据的指针变量 |
2.指针运算的小结
- 1). 指针变量加(减)一个整数
例如:p++、p–、p+i、p-i、p+=i、p-=i
一个指针变量加(减)一个整数并不是简单地将原值加(减)一个整数,而是将该指针变量的原值(是一个地址)和它指向的变量所占用的内存单元字节数加(减)。 - 2). 指针变量赋值:将一个变量的地址赋给一个指针变量。
p=&a; (将变量a的地址赋给p)
p=array; (将数组array的首地址赋给p)
p=&array[i]; (将数组array第i个元素的地址赋给p)
p=max; (max为已定义的函数,将max的入口地址赋给p)
p1=p2; (p1和p2都是指针变量,将p2的值赋给p1)
注意:不能如下:p=1000; - 3). 指针变量可以有空值,即该指针变量不指向任何变量。
p=NULL - 4). 两个指针变量可以相减:如果两个指针变量指向同一个数组的元素,则两个指针变量值之差是两个指针之间的元素个数。
指针相减 = (地址1-地址2)/sizeof(类型)void main(int argc, char *argv[]) { int a[]= {12, 45, 6, 7, 4, 45, 1}; int *p1, *p2; p1 = &a[1]; //0x0018ff28 p2 = &a[5]; //0x0018ff38 printf("%d\n", p2-p1); //显示4 }
- 4).两个指针变量比较:如果两个指针变量指向同一个数组的元素,则两个指针变量可以进行比较。指向前面的元素的指针变量“小于”指向后面的元素的指针变量。
(十一) 关于void类型
-
void真正发挥的作用在于:
1). 对函数返回的限定;
2). 对函数参数的限定。例如:void func(void)
-
void指针
ANSI新标准增加了一种“void”指针类型,即可以定义一个指针变量,但不指定它是指向哪一种类型数据。例如 : void *p;
1). 表示指针变量p不指向一个确定的类型数据,它的作用仅仅是用来存放一个地址。
2). void指针它可以指向任何类型数据。也就是说,可以用任何类型的指针直接给void指针赋值。但是,如果需要将void指针的值付给其他类型的指针,则需要进行强制类型转换。
(十二) const
#include <stdio.h>
void main(int argc, char *argv[])
{
const char *str1 = "I love china";
char * const str2 = "I love china";
const char * const str3 = "I love china";
//str1[0] = 'w'; //非法
str1 = 'hello world'; //合法
printf("%s", str1);
str2[0] = 'w'; //合法
str2 = 'hello world'; //非法
printf("%s", str2);
str3[0] = 'w'; //非法
str3 = 'hello world'; //非法
printf("%s", str3);
}
来源:CSDN
作者:草木红
链接:https://blog.csdn.net/kouzuhuai2956/article/details/104484713