//当指针指向数组元素的时候,可以对指针变量进行加减运算,如*(p+n),且支持[]运算符,如p[n]
//此时指针p+n指向原来指针p后面第n个元素p[n],而不是简单的将地址加一,而是加了数组中每个元素类型所占字节大小,p[n]=*(p+n)
//不一定需要通过定义指针指向数组来访问数组中的元素,数组名本身就是数组首地址
//可以使用字符指针定义字符串,用[](下标)访问字符串**
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
char a[] = "helloworld";
char* p = a;
printf("*p=%c,*(p+2)=%c,p[2]=%c\n", *p, *(p + 2), p[2]); //*p=h,*(p+2)=l,p[2]=l
printf("p:%p,p+1:%p\n", p, p + 1);//p:009DF6E4,p+1:009DF6E5 //相差一个字节,每次运行结果可能不一样
//由于该指针指向char类型数组,数组每个元素占一个字节,故p+1指向下一个元素的同时地址也加一
int b[] = { 1,2,3 };
int* pp = b; //指针指向b数组
printf("*pp=%d,*(pp+2)=%d,pp[2]=%d\n", *pp, *(pp + 2), pp[2]); //*pp=1,*(pp+2)=3,pp[2]=3
printf("pp:%p,pp+1:%p\n", pp, pp + 1); //pp:00AFFA98,pp+1:00AFFA9C //相差sizeof(int)=4个字节大小
printf("*b=%d,*(b+2)=%d,b[2]=%d\n", *b, *(b + 2), b[2]); //*b=1,*(b+2)=3,b[2]=3 //与使用定义的指向数组的指针访问数组一样
char* str = "helloworld"; //使用一个字符指针指向字符串常量,其实指向的是第一个字符'h'
printf("*str=%c\n", *str);//*str=h
int i, length;
length = strlen(str);
for (int i = 0; i < length; i++)
{
printf("%c", str[i]);
}
printf("\n");
//统计字符串中字符个数
char s[] = "helloworld";
int count = 0;
//while (*s++ != '\0') //出错,因为字符串s的“helloworld”存储区常量区,s是常量不可修改
//{
// count++;
//}
//修改如下
char* ps = s; //定义一个指针指向字符串“helloworld”,但此时ps是变量可修改
while (*ps++ != '\0') //++优先级高于*
{
count++;
}
printf("有%d个字符\n",count); //有10个字符
//指针数组(是数组)和数组指针(是指针)
//int* p[](指针数组) 和int (*p)[](数组指针) []优先级高于*
//如int* p[]中p[]首先是一个数组,数组中的元素类型为int* ,故为指针数组
//int (*p)[]中首先(*p)定义其为一个指针,指向一个数组,数组重元素类型为int
//********指针数组**********
int m = 0, j = 1, k = 2;
int* pa[3] = { &m,&j,&k };
for (int i = 0; i < 3; i++)
{
printf("%p %d\n", pa[i],*pa[i]); //012FF820 0 存放的每个元素的地址,根据地址可找到对应的数
//012FF814 1
//012FF808 2
}
char* pStr[3] = { "hello",
"world",
"xian" }; //相当于实现二维数组
for (int i = 0; i < 3; i++)
{
printf("%s\n", pStr[i]); //hello
//world
//xian
}
//********数组指针**********(指向整个数组,而不是指向数组的第一个元素,与前面 int*pp=b区别开来)
int tmp[3] = { 1,2,3 };
int(*ap)[3] = &tmp; //取得数组地址 因为数组名表示整个数组,本身就是地址,要指向整个数组,就需要指向这个地址,类似于二级指针
//int(*ap)[3] = tmp; //这样也可以,因为数组名就是数组的地址(&tmp==tmp),也是数组第一个元素的地址, 不建议这样写(与指向数组的指针int*p区别开)
for (int i = 0; i < 3; i++)
{
//ap为& tmp,* ap为tmp,(*ap + i)指向数组第i个元素
printf("%d\n", *(*ap + i)); // 1
// 2
// 3
}
return 0;
}
网友评论