C语言指针内容简要梳理

1.指针的定义

所谓的指针指的是指针变量(Pointer)。 从这个单词我们就可以看出这是指向(point)某个存在的东西(er)。即在计算机中,它(指针变量)指的是指向某个内存单元的一个变量。如下图:

int a = 0;//定义一个整形变量a
int* b = &a;//&为取地址符号,将a的地址传给b,b为指向a的一个整形指针.

2.指针类型的意义

上面我们谈到了指针是一个变量。从C语言来看,我们定义一个变量,必须要指定变量的类型。那么,当我们谈到指针变量时,我们也要制定它的类型。
指针变量是指向某个内存单元的一个变量。内存单元是存放数据的。某个内存单元并没有所谓的类型之分。从某种角度看,其实是内存单元存放的变量类型,决定了我们指针的类型。所以,我们的指针类型是由其指向内存地址存放的变量的类型决定的。因此,可以有int*,char*等等。
当指针的类型得以确定,那么对指针进行解引用时具有多大的权限。

3.指针的运算

3.1指针与整数的运算

#include <stdio.h>
//指针+- 整数
int main()
{
    
    
int arr[10] = {
    
    1,2,3,4,5,6,7,8,9,10};
int *p = &arr[0];
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
for(i=0; i<sz; i++)
{
    
    
printf("%d ", *(p+i));//p+i 这⾥就是指针+整数
}
return 0;

结果为

1 2 3 4 5 6 7 8 9 10

当我们运行代码,就可以看到依次打印数组的各个元素。*(p+i)等价于p[i],此时整数相当于数组中的元素(位置)。

3.2指针-指针

//指针-指针
#include <stdio.h>
int my_strlen(char *s)
{
    
    
	char *p = s;
	while(*p != '\0' )
	p++;
	return p-s;//非零元素的末地址-初地址
}
int main()
{
    
    
	printf("%d\n", my_strlen("abc"));
	return 0;
}

结果为

3

运行结果我们可以看到返回的是两指针之间的元素个数。

3.3指针的关系运算

#include <stdio.h>
int main()
{
    
    
	int arr[10] = {
    
    1,2,3,4,5,6,7,8,9,10};
	int *p = &arr[0];
	int i = 0;
	int sz = sizeof(arr)/sizeof(arr[0]);
while(p<arr+sz) //指针的⼤⼩⽐较
{
    
    
	printf("%d ", *p);
	p++;
}
	return 0;
}

结果为

1 2 3 4 5 6 7 8 9 10

代码运行的结果是,打印的是数组的各个元素。
代码中,p存的是首元素的地址,而arr+sz(首元素+元素个数即末元素的地址)

4.指针数组

从语法角度来看。指针修饰数组,即指的是数组。指针数组就是存放指针的数组。如

int a = 0;
int* b = &a;
int* p[1] = {
    
    b};

5.指针数组名是什么

一般情况下数组名就是首元素的地址。(两种例外,1是用sizeof(数组名),此时数组明为整个数组2.&数组名时也代表整个数组)
因此,指针数组名是首元素(指针)的指针,即二级指针。

#include <stdio.h>
int main()
{
    
    
	int a = 0;
	int* b = &a;
	int* p[1] = {
    
    b};
	printf("%d",**p);
	return 0;
}

结果为

0

当我们需要打印时,需要解引用两次。

6.数组指针

从语法角度来看。数组修饰指针,即指的是指针。数组指针就是指的是指向数组的指针。如

int (*p)[10] = {
    
    0};

p在括号里面先与*结合在与[10]结合,指向数组

7.函数指针

首先,先把结论放在这里:函数也是有地址的。
那么,指针就是专门来指向地址的变量,因此也可以用指针来指向函数,就叫做函数指针。如

#include <stdio.h>
void test()
{
    
    
printf("hehe\n");
}
int main()
{
    
    
printf("test: %p\n", test);
printf("&test: %p\n", &test);
return 0;
}

结果如下:

test: 005913CA
&test: 005913CA

8.函数指针数组

从语法角度来看。函数指针修饰数组,即本质是数组。函数指针数组指的是存放函数指针的数组。如

int (*parr1[3])();

在里面的括号里面,parr1先跟数组结合代表是数组,然后和*结合代表指针数组,在外面即为返回值为int型号的,没有形参的一个函数,总结一下就是函数指针数组(外》》内)

PS:举例引用的代码大都拷贝与比特就业课《鹏哥C语言》的课件。

猜你喜欢

转载自blog.csdn.net/BlankXiangzw/article/details/132390888