C基础 - 指针:1.2

指针和数组

1 - 指针对应的数组元素地址

1 int ages[5]={10,9,8,7,6};
2 int *p = ages;// 等同于:int *p = &ages[0];

第一个元素的地址p    &ages[0];第二个元素的地址p+1    &ages[1];第三个元素的地址p+2    &ages[2]  ......

2 -  示例代码

需求:利用指针,遍历出数组元素

1 int ages[5]={101,19,21,33,22};
2 int *p = ages;
3 for(int i=0;i<5;i++)
4 printf("%d\t",*(p+i));
5 printf("\n");

3 - 数组元素的三种访问形式

  (1) 数组名[下标]

  (2)指针变量名[下标]

  (3) *(指针变量+下标)

  (4)示例代码:

1 char *arr[4]={"ios","iphone","ipod","abc"};
2 printf("%s \n",arr[1]);// 输出:iphone
3 printf("%c \n",*(*(arr+1)+1));// 输出:p
4 printf("%s \n",arr[2]);// 输出:ipod
5 printf("%c \n",*(arr[2]+3));// 输出:d

注:指针变量的+1或-1究竟是加、减多少?这取决于指针的类型:如果是 char 类型的指针就加1个字节;如果是 int 类型的指针则加4个字节

4 - 利用指针来接收一个数组,指针变量指向数组的首元素

1 void change(int array[]);// 等价于:void change(int *array) 

5 - 数组名代表数组的首元地址,它是一个指针常量;指针可以当数组名使?。那么这样两者有什么区别呢 ?当然, 内存中所占字节数不一样

1 int ages[5]={1,2,3,4,5};
2 change(ages);// 输出 3
3 change(&ages[2]);// 输出5     原因:形参array指向的是 ages[2],意味着把ages[2]当做了 array 的首元素
1 int array[3]={1,3,4};
2 int *p = &array[0];// 等价于:int *p = array;
 1 char string[10] = "iphone";
 2 char *p = string;
 3 printf("%p \n", p);// 输出地址:0x7fff5fbff62e
 4 *(p+1)=‘P‘;// 操作单个字符串
 5 printf("%s\n",p);// 输出:iPhone
 6 printf("%c\n",*p);// 输出:i
 7 printf("%c\n",*(p+2));// 输出:h
 8
 9 p++;//向高位偏移
10 printf("%s \n",p);// 输出:Phone
11 printf("%c \n",*(p+1));// 输出:h
12 printf("%s \n",string);// 输出:iPhone
13 printf("%s \n",string+1);// 输出:Phone

指针和字符串

1 - 比较两行代码有什么不同

1 char name[] = "it";
2 char *name2 = "it";
3
4 name[0]=‘g‘;
5 printf("%s\n",name);// 输出:gt
6
7 *name2= ‘y‘;// 运行到此句崩溃
8 printf("%s\n",name2);

注:name 是字符串变量,*name2是字符串常量,C语言的数组元素存放于栈,里面的元素可以随便修改,称为字符串变量;而字符串常量存放于常量区,会缓存起来是不可更改的

1 char *name1 = "it";
2 char *name2 = "it";
3 printf("%p\n%p\n",name1,name2);// 地址是一样的,说明 name1 和 name2 指向的是同一个字符串

指针数组

1 - 定义:例如,整型数组:这个数组中存放的都是整型数组,那么,顾名思义,指针数组就是这个数组中存放的都是指针

1 int ages[5] = {0};
2 char *name[10]={"jack","rose","dany"};// 等同于:char name2[3][10] = {"jack","rose","dany"};

2 - 指针数组的重指向

1 char melee[3][20] = {"李小龙","查克·诺里斯","增根泰三"};
2 char *fistfight[3] = {"fist","foot","waist"};
3 fistfight[0] = &melee[0][0];// 重新指向
4 printf("%s\n",*fistfight);// 输出:李小龙

3 -  在控制台中,何输入字符串?(使用数组,为什么?可变嘛)

1 char name[20];
2 printf("请输入姓名:\n");
3 scanf("%s",name);
4 printf("您输入的姓名是:%s\n",name);

返回指针的函数

1 - 示例代码

main.m-------------------------------------------------------------------------------------------

 1 #import <Foundation/Foundation.h>
 2 char *test(){
 3
 4     return "你愁啥子?老子是指针!";
 5 }
 6
 7 int main(int argc, const char * argv[]) {
 8
 9     char *showSome = test();
10     printf("name=%s\n",showSome);
11
12     return 0;
13 }

注:void change(int array[]); 存储的虽然是数组元素的首地址,但是在传递时就已经变成了指针

指针函数

1 - 定义:正如数组名即数组的地址,那么函数名即函数的地址

2 - 示例代码

main.m-------------------------------------------------------------------------------------------

 1 #import <Foundation/Foundation.h>
 2 void makeTest(int a){
 3
 4     printf("%d\n",a);
 5
 6 }
 7 int main(int argc, const char * argv[]) {
 8
 9     void (*p)(int a);// void指针变量指向的函数没有返回值,()表示p指向的函数没有形参
10     p = makeTest;// 指针p指向函数
11
12     //调用方式有三种:
13     p(23);// 方式一
14     (*p)(33);// 方式二
15     makeTest(43);// 方式三
16 }

结构体指针

1 - 指向结构体变量的指针

2 - 结构体指针的声明

 1 #import <Foundation/Foundation.h>
 2 typedef struct student{
 3
 4     char name[20];
 5     char sex;
 6     int age;
 7     float score;
 8 }stu;
 9
10 typedef struct cpoint{
11
12     float x;
13     float y;
14
15 }Cpoint;
16
17 int main(int argc, const char * argv[]) {
18
19     stu a = {"fuck",‘m‘,23};
20     stu *p = &a;// p就是结构体指针,存放结构体变量第一个成员的地址,它代表整个结构体
21
22     stu a1 ={"asshole",‘m‘,26};
23     *p = a1;// 结构体可以直接赋值
24 }

3 - 访问成员变量

时间: 2024-12-20 00:14:29

C基础 - 指针:1.2的相关文章

黑马程序员---C语言基础---指针

------iOS培训.Java培训.Android培训, iOS学习型技术博客,期待与您交流------ C语言基础---指针 学习C语言,指针是必须重视的,本人觉得,正是因为指针才使得C语言如此的强大与妙不可言(当然还有其丰富的数据类型与运算符). 指针的作用,说的大白话一点就是:有了指针,就能找到你. 就好比全球定位系统,只要你在地球上,把精确的地址给我,我就能定位到你. 那么什么是指针变量呢?就是存放地址值的变量,该变量只能存放内存地址值,定义如下: 类型标识符   *指针变量名; 先看

Go语言 基础 指针

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

Windows 10开发基础——指针事件和操作事件(一)

主要内容: 1.指针事件 2.操作事件 1.指针事件 指针事件由各种活动输入源引发,包括触摸.触摸板.笔和鼠标(它们替代传统的鼠标事件).指针事件基于单一输入点(手指.笔尖.鼠标光标),但不支持基于速度的交互.下面是指针事件列表及其相关的事件参数列表: 事件或类 描述 PointerPressed 单根手指触摸屏幕时发生. PointerReleased 该同一触摸接触抬起时发生. PointerMoved 在屏幕上拖动指针时发生. PointerEntered 在指针进入元素的点击测试区时发生

黑马程序员——C语言基础---指针

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一. 指针变量的定义 1. 定义的格式 l 类名标识符  *指针变量名; l int *p; 2. 先定义后赋值 l 简单取值 int a = 10; int *p; p = &a; printf(“%d”, *p); l 简单改值 *p = 9; 3. 定义的同时赋值 int a = 10; int *p = &a; 4. 实现修改实参 5. 注意点 l int *p;   p = 1

C语言基础——指针

指针:变量,存储的值是另外一个变量的地址, 指针的类型取决于指向的变量类型. 指针使用时必须初始化,不然就是野指针.将会存储垃圾地址. 不能直接解引用一个空指针,否则会发生段错误,因为0号地址属于系统级空间,不允许用户级程序访问. p 与 *p p是指针变量,p 的值是p所指向的变量的地址: *p是p所指向的变量,*p的值是p所指向的变量的值:

C基础--指针数组

#include <stdio.h> //指针数组练习 int main1(void) { //int a[10]; char* arry[3] = {"hello", "world", "itcast"}; //char arry[3][20] = {"hello", "world", "itcast"}; //char *str = "hello";

C基础--指针与函数返回值

#include <stdio.h> #define A 0 int funcA(int a, int b) { return a + b; } /*把指针作为函数的返回值*/ int * funcB(int a, int b) { static int c = A; c = a + b; return &c; } /*通过函数进行内存的申请*/ /* * 参数:要申请的内存大小 * 返回值:申请好的内存的首地址 * 这是一种不好的方式 */ int * funcC(int size)

奶爸业余单片机学习之:C语言基础——指针(指针变量)学习笔记

指针变量的定义: 存放地址的变量称为指针变量 1. 定义指针变量的一般形式如下: 类型名 * 指针变量名1,* 指针变量名2,... * 指针变量名n ; 例如:  int * X, *Y, *Z; 等同于: int * X; int * Y; int * Z; 实例: #include<stdio.h>void main(){    int x = 1;    int y = 2;    int* A;        //声明一个指向整形变量的指针变量A    int* B;        

c语言基础----指针

什么是指针? 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址. 指针变量声明 type *var-name; type 是指针的基类型,它必须是一个有效的 C 数据类型,var-name 是指针变量的名称.用来声明指针的星号 * 与乘法中使用的星号是相同的. 空指针 赋为 NULL 值的指针被称为空指针,NULL 指针是一个定义在标准库中的值为零的常量. 数组指针: 它是一个指针,它指向一个数组.指向数组的指针,本质是指针. int (*p)[3]   因为()优先级高,首先说明