【C语言】基础(九)指针

  ·

指针

指针:指针就是地址
指针变量:存放变量地址的变量
使用指针的目的:要通过指针能够找到被指的变量,或者说要通过指针间接访问被指的变量
取变量;栈区

int *p 指向int类型的指针
%p 输出指针

&取址符

初始化
int *p=NULL; 必须初始化

定义时放*(*p=&a),赋值时不能放(p=&a )
* 类型说明的作用
间接访问指针指向内存的值的作用

p=&a; 打印:p为地址,*p值为a

void 类型的指针
可以指向任何变量,但在使用时,需要进行强制类型转换之后才能使用

void *p=&a;
printf("%d",*(int*)p);

指针大小:都为8个字节

指针运算:只能加减、不能乘除

p+n = p+n*sizeof(指向类型)

指针访问数组

1、数组名实际上就是一个指向该数组中第一个元素的指针
2、在实际数组元素前面加一个&与 p=&a[1];
3、在数组名后加偏移量,改变指向的数组元素

*(p+n) = array[n] = *(array + n);
p[0] == array[0];可以这样

访问数组两种方式:
下标法访问 数组名[下标] 指针[下标]

const指针
const int* p 指针指向的变量不可改变、可以修改指向、其指向内存被const修饰不可改变
(const 在 * 左边,修饰int)
int const* p 值不可变

int *const p (const在*右边,修饰指针)指针不能改变指向

const int *const p 只能初始化,都不能改

const在星号左边:
修饰的是指针指向的内存
1.指针可以改变指向
2.不可以通过指针改变其所指内存的值

const在星号右边:
修饰的是指针变量本身
1.指针不可以改变指向
2.可以通过指针改变其所指内存的值

const在星号左右
1.不可以改变指向
2.不可以通过指针修改值

注意:变量本身仍可以通过变量名去修改

指针与字符串
字符数组表示字符串
用字符指针指向一个字符串表示,指向首地址

char* str1 = "beijing" str1仅记录首地址
beijing存在数据区(常量不能改),不能根据str1[1]=E;修改

strcat不能用指针拼接。
strcpy

指针与函数

指针变量作为函数参数:将指针变量以实参的形式传递给函数,进行的是地址的传递,所以可以在函数中改变实参的值

数组名作为函数的实参和形参:进行地址传递

函数的返回值是一个指针:函数的返回值类型必须定义为指针类型

函数指针:指向函数的指针

数据类型(*指针变量名) (形参列表)
int (*p)(int a) --int(* )(int a)指向返回值为Int的函数指针
int *p1(int a) -- (int*) (int a) 返回值为int*函数。函数名为p1
括号不能省
int *(*p2)(int*a,int*b) ----指向返回值为int*,参数为。。的函数指针

指向函数的指针变量的说明:
1、把函数首地址赋给指针变量时,直接写函数名即可,不用写括号和函数参数
2、利用指针变量调用函数时,要写明函数的实际参数

p=func1; p(20) == func1(20)
//函数名就是函数的首地址
//表示函数指针P指向func1

指针访问二维数组

int a[3][4];
int (*p)[3][4];
p=&a; *p == a;
(*p)[1][1];
p[0] ==*p;
p[0][0][0]=a[0][0]
p[0][1]=a[1];

指针的指针(二维指针)
如果一个指针变量存放的是又一个指针变量的地址,则称这个指针变量为指向指针的指针变量。

int a;
int *p=&a;
int **p=&p;
**p == a

指向数组的指针
定义:类型名称 (*指针名)[数组长度]
如:int a[5]={1,1,1,1,1};int (*p)[5]=&a;
定义时不加括号就成了指针数组,因为[]优先级比*高。
数组指针定义时的数组长度,元素类型需与指向的数组相同

int(*p)[5];指向数组长度为5的整型数组的指针
char* (*p1)[10];指向类型为char* [10]的数组指针
int *p2[10];一个数组 类型为int* [10]

数组指针指向的是整个数组,不是单个元素
数组指针加1,相当于p+sizeo(数组名)
访问数组元素:a[0],*a,*(a+1),(*p)[0],p[0][0] (*p)==a, p[0]=a;

指针(数组)
如果数组元素都是指针变量,构成指针数组
一般形式:类型名称 * 数组名[数组长度]
int* a[10];每个元素都是int* 指针

时间: 2024-11-14 01:53:05

【C语言】基础(九)指针的相关文章

黑马程序员-C语言基础:指针类型与指针和数组、字符串的关系

//指针变量就是用来存储地址的,只能存储地址 格式:  int  *p;  这个p为指针变量:指针变量占8个字节 类型是用来说明这个指针指向的类型: 比如上边的int代表这个指针变量会指向int类型的存储空间: int *p = &a;//这样一句可以写,此时的*只是一个标志,表示这个*只是表示p是个指针: *p = &a;//这样写就错了:此时*p表示取p指向的空间的值: 指针疑问:指针既然都占据8个字节,那么为什么要划分类型, 是因为当用*p指针取值或者赋值的时候,知道该取几个字节,比

C语言基础知识----指针数组 && 数组指针 && 函数指针 &&指针函数

指针数组 && 数组指针 char (*ptr)[5]; //定义一个指向数组指针ptr,指向包含5个char类型的数组 char *a[5]; //定义一个指针数组a,包含5个char*类型指针 #include <stdio.h> int main(void) {     char *a[5]={"red","white","blue","dark","green"};   

8.Go语言基础之指针

Go语言中的指针不能进行偏移和运算,是安全指针. 在了解GO语言中的指针前,首先需要知道三个概念:指针地址.指针类型和指针取值. 1.Go语言中的指针 任何数据载入内存后,在内存中都有对应的地址,这就是指针. 为了保存一个数据在内存中的地址,需要指针变量. 比如"好好学习,天天向上"这个字符串写入程序中,程序一启动这句话就加载到内存(假设内存地址为0x123456),在程序中,把该字符串赋值给变量A,把该字符串的内存地址赋值给变量B. 这时变量B就是一个指针变量.通过变量A和变量B都能

Go语言基础之指针

区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. Go语言中的指针 任何程序数据载入内存后,在内存都有他们的地址,这就是指针.而为了保存一个数据在内存中的地址,我们就需要指针变量. 比如,“永远不要高估自己”这句话是我的座右铭,我想把它写入程序中,程序一启动这句话是要加载到内存(假设内存地址0x123456),我在程序中把这段话赋值给变量A,把内存地址赋值给变量B.这时候变量B就是一个指针变量.

黑马程序员_ C语言基础之指针(三)

概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移越来越模糊,感觉指针难以掌握,本文通过简单的例子试图将指针解释清楚,今天的重点有几个方面: 1.什么是指针 2.数组和指针 3.函数指针 什么是指针 存放变量地址的变量我们称之为“指针变量”,简单的说变量p中存储的是变量a的地址,那么p就可以称为是指针变量,或者说p指向a.当我们访问a变量的时候其实是程序先根据a取得a对应的地址,再到这个地址对应的存储空间中拿到a的值,这种方式我们称之为“直接引用”:

iOS开发之c语言基础Lesson-08 指针 上课笔记 与 试题练习

1 ////////////////Lesson 08 指针 课堂笔记 与练习///////////// 2 3 //指针:本质是一个指针变量,只不过该变量用来存储地址. 4 //地址:内存单元的编号,也是一个数,只不过是以0x开头的十六进制数. 5 6 // int a = 10; 7 // int *p = &a; //定义一个指针变量,将a的地址给指针变量p:p指向a 8 // a = 20; //直接访问 9 // printf("%d ", *p); 10 // *p

C语言基础_指针

一.指针变量 1.存储地址的变量 2.* 间接寻址符 3.%p 打印地址的格式字符 4.& 取地址符 获取变量的存储单元地址 5.int *p = &a p指向a的存储单元  [p就是一个指针  存储地址的变量] 6.*p 通过地址访问变量的存储单元(内容) 二.指针 int a[5]={3,4,1,2,5}; int *p = a;//定义一个指针指向首地址 printf("p[2] = %d\n",p[1]); printf("%d\n",*(p

黑马程序员&mdash;&mdash;【黑马视频笔记】C语言基础之指针

  1.指针的定义 格式:变量类型 *变量名;     1: // 定义了一个指针变量p 2: // 指针变量只能存储地址 3: // 指针就一个作用:能够根据一个地址值,访问对应的存储空间 4: // 指针变量p前面的int:指针变量p只能指向int类型的数据 5:   6: int *p; .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New&quo

c语言基础之指针

指针 直接访问:直接利用变量的地址进行存取,在变量前加& 如scanf的第二个参数 scanf("%d",&a);//&a指a的地址 间接访问:通过指针取访某一个变量的值: #include<stdio.h> int main() { int x = 10; int *y = &x; *y=20://指针的应用: printf("&x = %p,y = %p,x = %d \n",&x,y,x);//前两个

Go语言 基础 指针

Go语言基础之指针 区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. Go语言中的指针 Go语言中的函数传参都是值拷贝,当我们想要修改某个变量的时候,我们可以创建一个指向该变量地址的指针变量.传递数据使用指针,而无须拷贝数据.类型指针不能进行偏移和运算.Go语言中的指针操作非常简单,只需要记住两个符号:&(取地址)和*(根据地址取值). 指针地址和指针类型 每个变量在运行时都拥有一个地址,这个地