本文已参与[新人创作礼]活动,一起开启掘金创作之路
一.指针
1.概念
指针包含两部分:对象的地址和类型。
指针变量:专门存放地址的变量。
int *p; //其类型是int *,其基类型是int
2.指针变量的赋值
方法一.给p赋值
int *q; //先定义一个指针变量,注意这时是没有任何的地址;
int a=6;
q=&a; //q是用来存放整型变量a的地址此时q有了地址也就相当于有了a这值
printf("%d\n",*q); //输出为a的值,即为6
printf("%p",q); //%p代表的是地址,此时输出了地址
方法二. 给p赋初值
int b=6, * q = &b;
//注意不要以为第二种方法的赋初值理解成(*p)=&a;数据定义中的*只是用来说明p是一个指针变量,是一个表示类型的符号。赋初值时要忽略星号,实际执行的是p=&a;
printf("%d", *q);printf("%p", q);
与方法一输出结果一样
二.实数指针传参
主函数传参时要传实数的地址,swap(&a,&b)。
在swap 函数中使用了指针 *a ,*b;
上面在方法二已经讲到 (*q=&b)
所以在这里 *a=&a , *b=&b;
程序如下
void swap(int* a, int* b) { //交换函数
int t = *a;
*a = *b;
*b = t;
}
int main() {
int a = 1, b = 2;
swap(&a, &b); //传a,b的地址
printf("%d\n%d", a, b);
}
结果 a=2 ,b=1;
三.指针变量访问一维数组中的下标变量
假设要访问一维数组a的第0个元素a[0].必须先定义一个指针变量,并且让它存储a[0]的地址
int a[4], * p = &a[0]; //p=&a[0]与p=a等价,直接记住有[ ]可以和&抵消
*p = 5; //相当于a[0]=5;
如果说p指向a[0],那么p+n指针指向a[n],所以a[n]可以用*(p+n)表示
int b[4] = { 1,2,3,6 };
int* p; p = b;
for (int i = 0; i < 4; i++) {
printf("%d\t", *(p + i)); //输出数组b的值{1,2,3,6}
}
编程实例
void swap(int* p, int* q) { //交换函数
int t = *p;
*p = *q;
*q = t;
}
int main() {
int a[] = { 1,2,3 };
int* p=a;
swap(p, p+1);
printf("%d", a[0]);
printf("%d", a[1]);
}
优化
int main() {
int a[] = { 1,2,3 };
swap(a, a + 1); //后续为了方便可以直接写成这样,不徐再定义指针函数p
printf("%d", a[0]);
printf("%d", a[1]);
}
四.指针变量访问二维数组中的下标变量
int a[2][3], * p; //p用来指向变量
p = a[0]; //不要写成"p=a";可以写成"p=&a[0][0];" 两个[ ]一个&可以剔除一个[ ]一个&
注意是p指针指向a[0][0],所以*p=a[0], *(p+1)=a[0][1], *(p+2)=a[0][2], *(p+3)=a[1][0]……
int a[2][3] = { 1,2,3,4,5,6 }, i, * p = a[0];
for (int i = 0; i < 6; i++) {
printf("%d", *(p + i)); //输出数组b的值{1,2,3,4,5,6}
}
*p=a[0],传参也是一样的如下:
编程实例
int sum(int*p) { //参数传递后,p指向a[0][0]
int sum = 0;
for (int i = 0; i < 6; i++) {
sum = sum + *(p+i);
}return sum;
}
int main() {
int a[3][2] = { 1,2,3,4,5,6 };
int b = sum(a[0]);
printf("%d\t", b);
}
*p=a[0],传参也是一样的
或者
int sum(int (*p)[2]) {
int sum=0;
for (int i = 0; i < 6; i++) {
sum = sum + *(*p+i);
}return sum;
}
int main() {
int a[3][2] = { 1,2,3,4,5,6 };
int b = sum(a);
printf("%d\t", b);
}
(*p)[2] =a
五.字符串指针传参
char s[] = "hello"; //通常下
char * p = s; //指针联系字符串
printf("%s", p);
//更直接
char* d = "hello"; //指针表示字符串
printf("%s",d);
输出结果:hello
死记!! *p=s
编程实例
int my_strlen01(char* p)
{
//计算字符串有效长度
int i = 0;
while (p[i] != '\0') //字符串结束条件
{
i++;
}
return i;
}
int main() {
char* s = "hello";
int m = my_strlen01(s);
printf("%d", m);
}
输出结果 : 5