1、指针数组
指针数组的概念:
一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。一维指针数组的定义形式为
类型名数组名[数组长度];
例如:
int*name[4];
#include <stdio.h>
void main()
{
int a[5] = {1, 3, 5, 7, 9};
int *name[5] = {&a[0], &a[1], &a[2], &a[3], &a[4]};
int i;
for( i=0; i < 5; i++ )
{
printf("%d ", *name[i]);
}
printf("\n\n");
}
定义字符串数组及定义字符串指针打印:
#if 0
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void main()
{
char str[] = { "hello furong" };
int i;
for (i=0; *(str+i)!='\0'; i++)
{
printf("%c", str[i]);
}
}
#endif
#if 0
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void main()
{
char *str = { "hello furong" };
int i;
for (i = 0; str[i] != '\0'; i++)
{
printf("%c", str[i]);
}
}
#endif
#if 1
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void main()
{
char* str = { "hello furong" };
int i;
for (i = 0; *(str+i) != '\0'; i++)
{
printf("%c", str[i]);
}
}
#endif
用for循环打印字符串的条件为'\0','\0'在c语言中为字符串的结束符。
#include <stdio.h>
void main()
{
char a[] = "Fishc.com is a good web site!", b[40];
int i;
for(i=0; *(a+i) != '\0'; i++)
{
*(b+i) = *(a+i);
}
*(b+i) = '\0';
printf("String a is: %s\n", a);
printf("String b is: ");
for(i=0; b[i] != '\0'; i++)
{
printf("%c", b[i]);
}
printf("\n\n");
}
#include <stdio.h>
void main()
{
char a[] = "Fishc.com is a good web site!", b[40], *p1, *p2;
int i;
p1 = a;
p2 = b;
for( ; *p1 != '\0'; p1++, p2++)
{
*p2 = *p1;
}
*p2 = '\0';
printf("String a is: %s\n", a);
printf("String b is: ");
for(i=0; b[i] != '\0'; i++)
{
printf("%c", b[i]);
}
printf("\n");
}
1)用for循环进行字符串赋值后,需要加*(b+i) = '\0';进行结尾。
2)for循环中b[i]不能用阵阵p2代替,指针存储的是字符串的地址,打印指针使用s%字符串型格式符。
2、指向指针的指针
怎样定义一个指向指针数据的指针变量呢?
形式可以如: char**p;
p的前面有两个*号。*运算符的结合性是从右到左,因此**p相当于*(*p),显然*p是指针变量的定义形式。如果没有最前面的*,那就是定义了一个指向字符数据的指针变量。
现在它前面又有一个*号,表示指针变量p是指向一个字符指针变量的。*p就是p所指向的另一个指针变量。例如:
#include <stdio.h>
void main()
{
char *name[] = {"Fishc.com", "www.fishc.com", "home.fishc.com", "Fishc.com/dz"};
char **p;
int i;
for( i=0; i < 4; i++ )
{
p = name + i;
printf("%s\n", **p);
}
}
3、指针数组作main函数的形参
指针数组的一个重要应用是作为main函数的形参。在以往的程序中,main函数的第一行一般写成以下形式:
p
void main()
括弧中是空的。实际上,main函数可以有参数。
例如:
void main(int argc,char *argv[ ])
argc和argv就是main函数的形参。
main函数是由操作系统调用的。那么,main函数的形参的值从何处得到呢?
显然不可能在程序中得到。实际上实参是和命令一起给出的。也就是在一个命令行中包括命令名和需要传给main函数的参数。
命令行的一般形式为:
命令名 参数1 参数2……参数n
#include <stdio.h>
void main(int argc, char *argv[])
{
while( argc > 1 )
{
++argv;
printf("%s\n", argv);
--argc;
}
}
执行结果为乱码!
#include <stdio.h>
#include <stdlib.h>
void main (int argc, char *argv[])
{
int i;
printf ("the number of string is : %d\n", argc-1);
for(i=1; i < argc; i++)
{
printf ("the string %d is : %s\n", i, argv[i]);
}
}
定义 | 含义 |
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是一个指针变量,它指向一个指向整型数据的指针变量 |
一、指针变量加(减)一个整数
例如:p++、p--、p+i、p-i、p+=i、p-=i等。
指针变量赋值
将一个变量地址赋给一个指针变量。如:
p=&a; (将变量a的地址赋给p)
p=array; (将数组array首元素地址赋给p)
p=&array[i];(将数组array第i个元素 的地址赋给p)
p=max;(max为已定义的函数,将ma x的入口地址赋给p)
p1=p2;(p1和p2都是指针变量,将 p2的值赋给p1)
三、指针变量可以有空值,即该指针变量不指向任何变量,可以这样表示:p=NULL;
五、两个指针变量比较
若两个指针指向同一个数组的元素,则可以进行比较。指向前面的元素的指针变量“小于”指向后面元素的指针变量。