指针学习

1. 指针是什么?

  • 指针表示变量的地址,例如ptr=& pooh;,其中&取地址符取出pooh变量的地址,然后赋值给ptr,此时ptr可看成指针变量指向pooh变量。

2. 指针变量的声明和赋值

  • (1)声明指针变量:必须给出指向变量的类型,例如:
    int *pi,char *pc,float *pf
  • (2)指针变量赋值:
    pi=&x;

3. 取地址运算符 和 解引用运算符
(1)取地址运算符&取出变量地址,例如:

#include <stdio.h>
  int main(void){
  int age;
  printf("Please input your age");
  scanf_s("%d",&age);
  printf("%d",age);
  return 0;
}

(2)解引用运算符*找出指针指向的变量值

#include <stdio.h>
int main(void) {
	int age;
	int *pointer1;
	printf("Please input your age\n");
	scanf_s("%d", &age);
	pointer1 = &age;
	printf("%d", *pointer1);
	return 0;
}

4. 利用指针实现交换函数的问题(形参地址传递)

#include <stdio.h>
void intExchange(int* m, int* n); //声明 intExchange 函数

int main(void) {
	int x = 10;
	int y = 20;
	int* pointer1=&x;
	int* pointer2=&y;
	intExchange(pointer1, pointer2);
	printf("%d\n%d\n", *pointer1, *pointer2);
}

void intExchange(int* m, int* n) {
	int temp;
	temp = *m;
	*m = *n;
	*n = temp;
}

5. 数组和指针
(1). 数组名是数组首元素的地址,例如数组array的数组名 array==array[0]
(2). 在C语言中,指针+1表示的是增加指针类型对应的字节数:

#include <stdio.h>
int main(void) {
	int array[10];
	printf("array数组的首元素地址为:%p\n", array);                  //数组首元素的地址值
	printf("array数组的首元素地址为:%p\n", &array[0]);              //数组首元素的地址值
	printf("array数组的第二个元素的地址为 :%p\n", array + 1);       //数组第二个元素的地址值
	printf("array数组的第二个元素的地址为 :%p\n", &array[1]);       //数组第二个元素的地址值
}

输出结果为:

(3)数组中,指针的解引用符*

*(array+1)=array[1] //表示第二个数组元素的值
*array+1              //表示第一个数组元素值+1

6. 函数,数组和指针

  • 利用指针形参的函数处理一维数组 //计算一维数组元素之和
#include <stdio.h>
int sum(int *num, int n);     //声明sum函数时,括号内声明数组指针形参和变量n

int main(void) {
    int array[10] = {0,1,2,3,4,5,6,7,8,9};
    int total;
    total = sum(array, 10);  //调用sum函数时,括号内给出数组首元素地址,和常量
    printf("数组各元素和为%d", total);  
}

int sum(int* array, int n) {    //定义函数时,括号内给出数组形参和变量n
    int i=0;
    int total=0;
    for (i == 0; i < n; i++) {
        total = total + array[i];
    }
    return total;
}
  • 利用指针形参的函数处理二维数组 //计算二维数组元素之和
#include <stdio.h>
#define Rows 3
#define Cols 4

void Sum_rows(int ar[][Cols]); //声明函数时,数组地址的形参写成 int ar[][Cols],其中第二个中括号不能省略,表示ar指向一个内含4个int类型值的数组,这也可以写成 int (*ar)[Cols]
void Sum_cols(int ar[][Cols]);
void Sum_2D(int ar[][Cols]);

int main() {
	int Array[Rows][Cols] = { 
		{1,2,3,4},
		{5,6,7,8},
		{9,10,11,12} 
	};
	Sum_rows(Array);
	Sum_cols(Array);
}

//定义函数用于计算每行元素之和,并输出
void Sum_rows(int ar[][Cols]) {
	int r=0;
	int c=0;
	int total = 0;
	for (r = 0; r < Rows; r++) {
		total = 0;
		for (c = 0; c < Cols; c++)
		total = total + ar[r][c];
		printf("第%d行元素之和为%d\n", r, total);
	}
}

//定义函数用于计算每列元素之和,并输出
void Sum_cols(int ar[][Cols]) {
	int r = 0;
	int c = 0;
	int total = 0;
	for (c = 0; c < Cols; c++) {
		total = 0;
		for (r = 0; r < Rows; r++)
			total = total + ar[r][c];
		printf("第%d列元素之和为%d\n", c, total);
	}
}

//定义函数用于计算每行每列元素之和,并输出
void Sum_2D(int ar[][Cols]) {
	int r = 0;
	int c = 0;
	int total = 0;
	for (c = 0; c < Cols; c++) {
		for (r = 0; r < Rows; r++)
			total = total + ar[r][c];
	}
	printf("总和为%d\n", total);
}

7. 指针和字符串

#include <stdio.h>

int main() {
	const char* mesg = "Think different";
	const char* copy;
	copy = mesg;

	printf("%d\n", *mesg);//表示指针指向的内容
	printf("%d\n", *copy);
	printf("%d\n\n", 'T');

	printf("%p\n", mesg);//表示指针的值
	printf("%p\n\n", copy);

	printf("%p\n", &mesg);//表示指针的存储地址
	printf("%p\n", &copy);
}

posted @ 2021-12-01 22:38  轩邈、  阅读(39)  评论(0编辑  收藏  举报