一、一维数组和一级指针
1、定义一个一维数组和一个一级指针:
int array[4]={0,1,2,3};
int *p=array;
其中array为这个数组的首地址,等效&array[0];
(1):数组名代表数组所在一段内存的首地址
(2):数组的指针表示:array+i与&array[i]等效,代表下标为i的数组元素的地址;同理,*(array+i)与array[i]等效,代表数组下标为i的数组元素的值。
(3):指针指向数组后,可以用 *(p+i)或者p[i]代表数组的值(注意数组越界)。
2、常见用法以及优化
(1):指针传递
int array[4] = { 1,2,3,4 };
int *p = array+2;
printf("%d\t", p[1]);
这个案例表示
因此输出结果为4
(2):便于查找数组中指定的元素,并快速修改
例如先查找数组中数值为2的元素,并返回其在数组中的位置(指定下标),并快速修改。
int array[4] = { 0,1,2,3 };
int pos = 0;
int *p = array;
while (p < array + 3 && *p != 2)
{
p++;
pos++;
}
printf("%d\t%d\n", *p,pos);
*p = 50;//修改指定位置的值
for (int i = 0; i < 4; i++)
{
printf("%d\t", array[i]);//打印数组元素
}
打印结果:
(3):用来操作字符串
1、基操
char *pStr = "i am a boy";
printf("%s\n", pStr);
char array[] = "i am a boy";
pStr = array;
printf("%c\n", *pStr);
printf("%s\n", pStr);
*pStr = 'M';
printf("%s\n", pStr);
打印结果:
2、字符串连接与拷贝
字符串连接:
char str[30] = { "YourApple" };
char strConnect[] = { "juice" };
char *p1 = str;
char *p2 = strConnect;
while (*p1 != '\0')
{
p1++;
}
while (*p2 != '\0')
{
*(p1++) = *(p2++);
}
printf("%s\n", str);
字符串拷贝:
注意字符串结束标记!!!!!
char str[30] = { "YourApple" };
char strConnect[] = { "juice" };
char *p1 = str;
char *p2 = strConnect;
while (*p2 != '\0')
{
*(p1++) = *(p2++);
}
*p1 = '\0';//注意字符串结束标记!!!!!
printf("%s\n", str);
都是基操,没啥可说,看看程序和图就懂了。
二、简单的二级指针和所谓万能指针
一级指针是存放变量的地址,那么二级指针就是存放一级指针的地址,以此类推,三级指针就是存放二级指针的地址等等。
int a = 1;
int *p = &a;
int **pp = &p;
printf("%d\n", **pp);
有些二级指针当做函数参数使用,例如在函数中修改某个指针的指向,跟在函数中用一级指针修改值有异曲同工之妙。
万能指针void*类型,可以指向任何类型的指针,也可以存储任意变量的地址。
int a = 1;
char b = 'a';
void *p1 = &a;
void *p2 = &b;
printf("%d\n%c\n", *(int*)p1, *(char*)p2);
打印结果:
事实上,定义随便定义,但是使用的时候要进行类型的强制转换。
其次,void*类型可以传任何类型的参数;作为函数返回值,可以用强制转换赋值给任何类型的变量。
指针的东西实在是多,下回介绍一下指针的动态申请内存/二维数组与二级指针的操作/指针数组和数组指针的区分等。
如果有错误的地方希望大佬 可以批评指正,,有用的话顺便用您金贵的玉手点个赞,万分感谢!!