1、 指针是什么?

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

 

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

int *pi

char *pc

float *pf

 

3、指针变量的大小

指针变量的大小取决于操作系统和编译器的架构,而不是它所指向的数据类型

平台架构 指针大小
32位系统 (x86) 4字节
64位系统 (x86_64) 8字节

1°  在 64 位系统上,int 通常是 4 字节,但 int * 是 8 字节

 

4、取地址运算符 和 解引用运算符

(1)取地址运算符&取出变量地址,例如:

#include <stdio.h>
int main(void)
{
    int age;
    printf("Please input your age");
    scanf("%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("%d", &age);
	pointer1 = &age;
	printf("%d", *pointer1);
	return 0;
}

 

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

#include <stdio.h>
void intExchange(int* m, int* n); 

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

(4)array ,   &array[0]   和 &array 

arr int* 首元素地址 array + 1 增加4个字节,表示array[1]
&arr[0] int* 首元素地址 同上
&arr int (*)[5] 整个数组的地址 &arr + 1 增加20个字节,表示数组之后的内存

(5)指针数组和数组指针

特性 (指针数组) (数组指针)
声明形式 int* arr1[10]  int (*arr2)[10]
本质 数组(10个元素) 指针(1个变量)
sizeof 10 * sizeof(int*) = 80字节(64位) sizeof(int*) = 8字节
元素类型 int* int[10]
arr[i]的类型 int* int[10](可再 [j] 下标访问)
+1跳跃 跳8字节(下一个指针) 跳40字节(下一个10-int数组)
初始化 需10个int*地址 int[x][10]的地址

 

6、函数,数组和指针

一维数组array退化为首元素地址

#include <stdio.h>
int sum(int *num, int n);     //声明sum函数时,括号内声明指针形参num和变量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) 
{    
    int i=0;
    int total=0;
    for (i = 0; i < n; i++) 
    {
        total = total + array[i];  // 这里array[i] 等价于 *[array+i]
    }
    return total;
}

 

二维数组matrix退化为第一行数组地址

#include <stdio.h>

// 参数:指向包含5个int的数组的指针,行数
int sum(int (*array)[5], int rows) 
{
    int total = 0;
    // 双重循环遍历
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 5; j++) {
            total += array[i][j];  // 或使用 *(*(array+i)+j)
        }
    }
    return total;
}

int main(void) 
{
    int matrix[3][5] = {
        {0, 1, 2, 3, 4},
        {5, 6, 7, 8, 9},
        {10, 11, 12, 13, 14}
    };
    
    int total = sum(matrix, 3);  // matrix退化为 int(*)[5]
    printf("二维数组各元素和为: %d\n", total);  // 输出: 105
    
    return 0;
}

 

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 on 2021-12-01 22:38  轩~邈  阅读(65)  评论(0)    收藏  举报