指针

Pointer

  • 定义简单指针
  • 在常见c 表达式中使用指针
  • 实现指向结构体,数组和函数的指针
  • 使用指针创建链表
  • 向指针应用const 关键字
  • 将指针作为参数传送给函数

演示指针

#include<stdio.h>
int main(void)
{
    int count = 10,x;
    int *int_pointer;
    int_pointer = &count;
    x = *int_pointer;
    printf("count = %i, x = %i, count, x");
    return 0;
}

代码输出为conunt =10,x =10

char c = 'Q';
char *char_pointer = &c;

//指针定义:将指针关联给xxx

int i1, i2;
int *p1,*p2;
p1 = &i1;
i2 = *p1 /2 +10;
p2 = p1;

//在表达式中使用指针

struct date today;
struct date *datePtr;
datePtr = &today;

//使用结构体的指针

(*datePtr).month = 12;
datePtr->month = 12;

//给结构体的指针所指向的结构体的某个变量赋值。

struct intPtrs
{
    int *p1;
    int *p2;
}
struct intPtrs pointers;
int p1,p2;
pointers.p1 = &i1;
pointers.p2 = &i2;

//包含指针的结构体

链表

Linked List

含义“在计算机科学中,链表是数据元素的线性集合,其中线性顺序不是由它们在存储器中的物理位置给出的。相反,每个元素指向下一个。它是由一组节点组成的数据结构,它们共同表示一个序列。在最简单的形式下,每个节点由数据和引用(换句话说,一个链接)组成)到序列中的下一个节点。

In computer science, a linked list is a linear collection of data elements, in which linear order is not given by their physical placement in memory.Instead, each element points to the next. It is a data structure consisting of a group of nodes which together represent a sequence. Under the simplest form, each node is composed of data and a reference (in other words, a link) to the next node in the sequence.

struct entry
{
   int value;
   struct entry  *next;
}
struct entry n1,n2,n3;
n1.next = &n2;
n2.next = &n3;

//定义一个链表

作用

链表会大幅度简化一些操作,比如在大型有序项目列表中插入和删除元素。

n1.next = n2.next;
n1.next = &n3;
//删除n2元素,将n1连接到n3
n2_3.next = n2.next;
n2.next = &n2_3;
//添加一个n2_3元素

注:n2_3插入时语句顺序十分重要,而且n2_3可以存储在内存中的任意位置,并不需要香数组一样,依次存储在内存中。

#include<stdio.h>
int main(void)
{
struct entry
{
   int value;
   struct entry  *next;
}
struct entry n1,n2,n3;
struct entry *list_pointer = &n1;   
//定义一个链表起始位置的指针,用该语句设定为指向该列表的开头
n1.value = 100;
n1.next = &n2;
n2.value = 200;
n2.next = &n3;
n3.value = 300;
n3.next = (struct entry *) 0;
//用空指针标记列表的末尾。"(struct entry*)"强制将常数0转换为适当的类型  
while (list_pointer != (struct entry*) 0 )
{
    printf("%i\n",list_pointer->value);
    list_pointer = list_pointer->next;
}
return 0;
}

//一个简单完整的链表程序

动态内存分配:之后补充

关键字const在指针方面的应用

char c ="x";
char *const charptr = &c;//指针方向不能被修改,总是指向c
//读作“charptr是一个指向字符的常量指针”
const char *charptr = &c;//指针指向的值不能被修改
//读作“charptr 指向一个常量字符”
const char * const *charptr =&c;//二者皆不可以被修改
//指针所应用位置的内容不能被修改。指针本身不能被修改

指针与数组

int *valuesPtr;
valusePtr = valuse;
//valuesPtr = &values[0];
*valuesPtr      
*(valuesPtr+i)
*(valusePtr+10) = 27;
//valusePtr[10]  =27;
valusePtr += 1;
++ valusePtr;
-- valusePtr; 
valusePtr >&values[99];
//valusePtr >values+99;

在c语言中数组表达式x[i]总是可以等价的表达为*(x+i)

#include<stdio.h>
/*该函数对一个整数数组进行求和
目标是为了观察指针在数组方向的应用*/
int arraySum(int array[], const int n)
{
    int sum = 0, *ptr;
    int * const arrayEnd = array + n;

    for (ptr = array; ptr < arrayEnd; ++ptr)
        sum += *ptr;
    return sum;
}

int main(void)
{
    int arraySum(int array[], const int n);
    int value[10] = { 0,1,2,3,4,5,6,7,8,9 };
    printf("The Sum is %i\n", arraySum(value, 10));
    system("pause");
    return 0;
}

/*对上个函数进行了优化,函数的形参是数组的指针,
并删除了*ptr这个变量*/
int arraySum(int *array, const int n)
{
    int sum = 0;
    int *const arrayEnd = array + n;
    for (; array < arrayEnd; ++array)
        sum += *array;
    return sum;
}

int main(void)
{
    int arraySum(int *array, const int n);
    int value[10] = { 0,1,2,3,4,5,6,7,8,9 };
    printf("The Sum is %i\n", arraySum(value, 10));
    system("pause");
    return 0;
}

指针与字符串

char *textPtr;
textPtr ="A character string.";

//将一个常量字符串的指针赋给textPtr。

char text [80];
text ="this is not valid.";//该语句会报错
char text[80] = "this is okay.";

//将字符串赋予数组只能在初始化的时候才可以。

char *days [] = {"monday","tuesday","wednesday","thursday"friday","saturday","sunday"};
days[1] = monday;

//数组days定义为包含7个字符串

递增和递减运算符

j = ++i;
++i;
j = i;
printf("%i\n",++i);
*(++Ptr);

//前递增

j = i++;
j = i;
i++;
printf("%i\n",i++);
*(Ptr++);

//后递增
//递减同理。执行后数值相同,数值变化过程不同

指针操作

3种操作

  1. 指针加减整数值
  2. 比较两个指针,是否相等或者大小于。
  3. 同类型指针相减
int values[], n;
int *a;
int *b;
a = values;
b = &values[99]; 
n = a-b;
n = 99;

//同类型指针相减运算

指针与函数

int lookup (void);//声明函数
int (*fnPtr) (void);
fnPtr = lookup;

//将指针变量fnPtr声明为“指向返回int的无参数函数的指针”类型

总结


指针感觉就是一个储存内存地址的变量。

通俗一点,就是类似于给一个物体加了一个标签,这个物体可以是各种变量,数组,函数,甚至是标签本身或者一切事先可以定义的东西。相同类型的物体就可以通过这个标签加编号来进行使用,而不需要重复繁琐的过程。

不知道对不对,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值