《C语言》指针及指针传参 ---总结版

207 阅读3分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路

一.指针

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

            看在她这么可爱的份上可以给个三连吗   嘿嘿

             看了眼她,再看看我,感觉自愧不如,呜呜┭┮﹏┭┮