C语言常用指针

简介: C语言常用指针

C语言中指针是记录数据在内存中的地址(习惯上将这个地址叫做指针),可以直接用来操作和获取数据,本文将带你了解常见的C语言指针。

c语言使用&来获取数据在内存中的地址,使用*来获取指定地址所对应的数据。在接受指针时,需要特定的指针类型来接受指针变量,一般类型中会带有*,也就是说*有两个作用,一个是用来获取特定地址的数据,一个是用来作为指针类型来声明变量。特殊的,对于数组而言,数组名本身就是数组的首地址。

int a = 1;
int* a_point = &a;
int b = *a;  // a == b
char str = 'c';
char* str_point = &str;
char str1 = *str_point;   // str == str1
int list[10] = {1,2,3,4,5,6,7,8,9,0};
// list == &list[0]  数组名就是首元素地址

不同类型的指针类型每次所能在内存操作的数据量有所不同,下图是使用16进制来表示一个4字节的整型数据,对于int*类型指针每一次可以操作4(sizeof(int))个字节的数据,而char*类型的指针每一次可以操作1sizeof(char))个字节的数据。

8e0b3b600cb36cf7be64ea5ee3d606b0_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

不同类型指针操作的数据大小

int int_list[10] = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3};
// int_list是int_list的首地址,且类型是int*
for(int i=0;i<10;i++){
    printf("%d ", *(int_list + i));
}
for(int j=0;j<10;j++){
    // 这里先将int_list转换成了char*类型的指针,然后再加一
    printf("%d ", *(((char*)int_list + j)));
}

使用指针可以改变变量在内存中的值,比如像下面这样

int a = 1;
int a_point = &a;
*a = 2;
printf("%d", a); // 2

这种使用指针在全局位置修改一个整型变量的方法是不常用的,更多的是在函数中使用

void add1(int* number){
  *number = *number+1;
}
int a = 1;
add1(&a);
printf("%d",a);  // 2

对于数组而言,数组名本身是一个指针,如果数组中存储的依然是指针的时候,那么这个数组就是指针数组;如果有一个变量指向整个数组的地址,那么这个变量是一个数组指针。总的来说,数组指针是一个指针,它是指向整个数组的指针,指针数组是一个数组,他里面的元素是指针。

「指针数组」

int* list[6] = {1,2,3,4,5,6};

list是一个6个元素的数组,而里面的数据类型是int*

「数组指针」

int list[6] = {1,2,3,4,5,6};
int (*list_point)[6] = &list;

这里的&listlist的值是相同的,但意义是不同的。&list表示的整个数组的地址,而list是表示首元素的地址。他使用起来和一般的首地址相加减也有所不同,下面是两种指针获取元素值的方法。

int list[6] = {1,2,3,4,5,6};
int (*list_point1)[6] = &list;  // 整个数组的地址
int* list_point2 = list;         //首元素地址
for(int i=0; i<6; i++){
  printf("%d ",*(*list_point1 + i));
}
for(int i=0; i<6; i++){
  printf("%d ",*(list_point2 + i));
}

「函数参数设计」

大部分指针会被用在函数中,这是因为在c语言中参数的传递有两种,一种是值传递,一种是地址传递。而对于字符串、数组这样的数据类型,如果传递的是变量名,其本质是属于地址传递的范畴。

int * return_int_list(int* int_list)

对于上面一个函数而言,函数的返回类型是int* ,参数类型是一个int* ,那么在传参的时候可以直接传入一个int型的数组名,函数内部返回的时候也可以返回一个int的数组名,就像下面这样。

int list[10];
int* return_list(int* int_list){
  return int_list
}

在函数中,还有一种参数类型也会用的十分频繁,那就是二级指针。对于一个指针数组而言,在以数组名传参的时候,他的类型就是一个二级指针。具体的可以看下面这个例子

char * names[3] = {
  "Jack",
    "Tom",
    "Tony"
};
void print_names(char** names) {
  for (int i = 0; i < 3; i++) {
    printf("%s\n", names[i]);
  }
}
print_names(names);  // names的类型就是char**

「函数指针」

指向函数的指针就是函数指针。他的形式非常有意思,比如下面的一个函数

int add_two_number(int a, int b){
    return a+b;
}

函数的返回类型是int,函数的参数是两个都是int类型,那么他的函数指针形式就是下面这样

int (*func_point)(int,int) = add_two_number;

总结一下的话,形式就是:

[返回类型] (*函数指针名) [(函数参数的类型)]

以上就是关于c语言中常用的指针知识,除了这些,还有结构体指针、动态内存返回的指针,这些内容不再本文进行讲解,有兴趣了解的同学可以私信告诉我,可以后面再写一篇关于c语言指针的文章。

相关文章
|
2月前
|
存储 编译器 C语言
【C语言】【指针1】指针难?看这个就够了!
【C语言】【指针1】指针难?看这个就够了!
|
21天前
|
存储 C语言
【C语言基础】一篇文章搞懂指针的基本使用
本文介绍了指针的概念及其在编程中的应用。指针本质上是内存地址,通过指针变量存储并间接访问内存中的值。定义指针变量的基本格式为 `基类型 *指针变量名`。取地址操作符`&`用于获取变量地址,取值操作符`*`用于获取地址对应的数据。指针的应用场景包括传递变量地址以实现在函数间修改值,以及通过对指针进行偏移来访问数组元素等。此外,还介绍了如何使用`malloc`动态申请堆内存,并需手动释放。
|
24天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
2月前
|
C语言
C语言------指针
这篇文章是关于C语言中指针的实训,通过示例代码展示了指针的基本概念、定义、赋值、使用和传递,以及指针运算和指针在函数参数中的应用,如交换两个变量的值和找出两个数中的较小值。
C语言------指针
|
1月前
|
存储 安全 C语言
C语言 二级指针应用场景
本文介绍了二级指针在 C 语言中的应用,
|
2月前
|
存储 编译器 C语言
【C语言篇】深入理解指针2
代码 const char* pstr = "hello world."; 特别容易让初学者以为是把字符串 hello world.放 到字符指针 pstr ⾥了,但是本质是把字符串 hello world. 首字符的地址放到了pstr中。
|
2月前
|
存储 程序员 编译器
【C语言篇】深入理解指针1
assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终⽌运⾏。这个宏常常被称为“断⾔”。
|
2月前
|
存储 搜索推荐 C语言
C语言中的指针函数:深入探索与应用
C语言中的指针函数:深入探索与应用
|
2月前
|
存储 编译器 C语言
【C语言】指针练习题目
【C语言】指针练习题目
|
2月前
|
C语言 Python
C语言指针(2)
C语言指针(2)
25 5
下一篇
无影云桌面