一、指针变量的定义

1. 格式:变量类型 *指针变量名;
2. 举例:int *p;   char *p2;
3. 注意:定义变量时的*仅仅是指针变量的象征

二、利用指针变量简单修改其他变量的值

1.指向某个变量
int a;

int *p;
p = &a;
或者
int *p = &a;

2.修改所指向变量的值
*p = 10;

3.在函数内部修改外面变量的值
int a = 10;
change(&a);

void change(int *n)
{
    *n = 20;
}

三、指针与数组

1.将数组当做函数参数传入时,会自动转为指针

四、指针与字符串

1.定义字符串的2种方式
1> 利用数组
char name[] = "ios";
* 特点:字符串里面的字符是可以修改的
* 使用场合:字符串的内容需要经常修改

2> 利用指针
char *name = "ios";
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用

2.定义字符串数组
1> 利用二维字符数组
char names[2][10] = {"jack", "rose"};

2> 利用指针数组
char *names[2] = {"jack", "rose"};

五、代码

1.定义

 #include <stdio.h>

 void change(int);

 int main()
{
/*
int a = 90; change(&a); printf("a=%d\n", a);
*/ // 变量类型 变量名;
// 格式:变量类型 *变量名;
// 定义了一个指针变量p
// 指针变量只能存储地址
// 指针就一个作用:能够根据一个地址值,访问对应的存储空间
// 指针变量p前面的int:指针变量p只能指向int类型的数据
int *p; int a = ; // 指针变量p指向了变量a
p = &a; *p = ; a = ; printf("%d\n", *p); //printf("%d\n", a); return ;
} void change(int n)
{
n = ;
}

2.使用注意

 #include <stdio.h>

 int main()
{
/* 不建议的写法, int *p只能指向int类型的数据
int *p;
double d = 10.0;
p = &d;*/ /* 指针变量只能存储地址
int *p;
p = 200;
*/ /* 指针变量未经过初始化,不要拿来间接访问其他存储空间
int *p;
printf("%d\n", *p);
*/ int a = ;
/*
int a;
a = 10;
*/ /*
int *p;
p = &a;
*/
// 定义变量时的*仅仅是一个象征,没有其他特殊含义
int *p = &a; // 不正确的写法
// *p = &a;
p = &a; // 这个时候的*的作用:访问指向变量p指向的存储空间
*p = ; char c = 'A'; char *cp = &c; *cp = 'D'; printf("%c\n", c); return ;
}

3.指向指针的指针

 #include <stdio.h>
int main()
{
int a = ; int *p = &a; int **pp = &p; // a = 20; // *p = 20; /*
(*pp) == p *(*pp) == *p = a **pp == *p = a
*/
**pp = ; printf("%d\n", a); //int ***ppp = &pp; /*
char a2 = 'A';
char *p2 = &a2;
*/ return ;
}

4.练习

 #include <stdio.h>
void swap(int *v1, int *v2); int main()
{
/*
int a = 10;
int b = 11; swap(&a, &b);
*/ int a2 = ;
int b2 = ; swap(&a2, &b2); printf("a2=%d, b2=%d\n", a2, b2);
return ;
} /* 不能交换外面实参的值,仅仅是交换了内部指针的指向
void swap(int *v1, int *v2)
{
int *temp;
temp = v1;
v1 = v2;
v2 = temp;
}*/ // 完成两个整型变量值的互换
void swap(int *v1, int *v2)
{
int temp = *v1;
*v1 = *v2;
*v2 = temp;
} /* 交换的只是内部v1、v2的值
void swap(int v1, int v2)
{
int temp = v1;
v1 = v2;
v2 = temp;
}*/
 #include <stdio.h>
int sumAndMinus(int n1, int n2, int *n3); int main()
{
int a = ;
int b = ; // 存储和
int he;
// 存储差
int cha;
c
he = sumAndMinus(a, b, &cha); printf("和是%d, 差是%d\n", he, cha); return ;
} // 返回值是
int sumAndMinus(int n1, int n2, int *n3)
{
*n3 = n1 - n2; return n1 + n2;
}

5.指针和数组

 #include <stdio.h>

 /*
1.数组元素的访问方式
int ages[5];
int *p;
p = ages;
1> 数组名[下标] ages[i]
2> 指针变量名[下标] p[i]
3> *(p + i) 2.指针变量+1,地址值究竟加多少,取决于指针的类型
int * 4
char * 1
double * 8
*/
void change(int array[]); int main()
{
// 20个字节
int ages[] = {, , , , }; change(ages); return ;
} // 利用一个指针来接收一个数组,指针变量array指向了数组的首元素
void change(int *array)
{
printf("%d\n", array[]);
//printf("%d\n", *(array+2));
} /*
void change(int array[])
{
int s = sizeof(array); printf("%d\n", s);
}*/ void test()
{
double d = 10.8;
double *dp;
dp = &d; printf("dp = %p\n", dp);
printf("dp + 1 = %p\n", dp + ); int ages[] = {, , , , }; int *p;
// 指针变量p指向了数组的首元素
p = &ages[];
// 数组名就是数组的地址,也是数组首元素的地址
//p = ages; /*
p ---> &ages[0]
p + 1 ---> &ages[1]
p + 2 ---> &ages[2]
p + i ---> &ages[i]
*/ //printf("%d\n", *(p+2)); printf("%d\n", p[]); /*
for (int i = 0; i<5; i++) {
printf("ages[%d] = %d\n", i, *(p+i));
}*/ // printf("%p\n", p);
// printf("%p\n", p + 1);
// printf("%p\n", p + 2);
}

6.指针和字符串

 #include <stdio.h>

 /*
1.常量区
存放一些常量字符串 2.堆
对象 3.栈
存放局部变量 掌握:
定义字符串的2种方式
1> 利用数组
char name[] = "itcast";
* 特点:字符串里面的字符是可以修改的
* 使用场合:字符串的内容需要经常修改 2> 利用指针
char *name = "itcast";
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
*/ int main()
{
char name[]; printf("请输入姓名:\n"); scanf("%s", name); // 'j' 'a' 'c' 'k' '\0' //printf("%c\n", name[3]); //printf("刚才输入的字符串是:%s\n", name); return ;
} // 定义字符串数组
void test2()
{
char *name = "jack"; //int ages[5]; // 指针数组(字符串数组)
char *names[] = {"jack", "rose", "jake"}; // 二维字符数组(字符串数组)
char names2[][] = {"jack", "rose"};
} // 定义字符串
void test()
{
// 字符串变量
char name[] = "it";
name[] = 'T'; //printf("%s\n", name); // "it" == 'i' + 't' + '\0'
// 指针变量name2指向了字符串的首字符 // 字符串常量
char *name2 = "it"; char *name3 = "it"; //*name2 = 'T'; //printf("%c\n", *name2); printf("%p\n%p\n", name2, name3); //printf("%s\n", name2);
}
 #include <stdio.h>
/*
(不包括\0)
编写一个int string_len(char *s),返回字符串s的字符长度 */
int string_len(char *s); int main()
{
//char *name = "itcast"; // 男 \u434\u4343\u434 int size = string_len("tre777"); printf("%d\n", size);
return ;
} int string_len(char *s)
{
// 1.定义一个新的指针变量指向首字符
char *p = s; /*
while ( *s != '\0' )
{
s++;
}*/ while ( *s++ ) ; return s - p - ;
} /*
int string_len(char *s)
{
// 记录字符的个数
int count = 0; // 如果指针当前指向的字符不是'\0'
// 首先*s取出指向的字符
// 然后s++
while ( *s++ )
{
// 个数+1
count++; // 让指针指向下一个字符
//s = s + 1;
//s++;
} return count;
}
*/ /*
int string_len(char *s)
{
// 记录字符的个数
int count = 0; // 如果指针当前指向的字符不是'\0'
while ( *s != '\0')
{
// 个数+1
count++; // 让指针指向下一个字符
//s = s + 1;
s++;
} return count;
}*/

【学习笔记】【C语言】指针的更多相关文章

  1. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  2. [java学习笔记]java语言核心----面向对象之this关键字

    一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理:         代表的是当前对象.         this就是所在函数 ...

  3. [java学习笔记]java语言核心----面向对象之构造函数

    1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用:                给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...

  4. Java学习笔记:语言基础

    Java学习笔记:语言基础 2014-1-31   最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...

  5. IOS学习笔记07---C语言函数-printf函数

    IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...

  6. IOS学习笔记06---C语言函数

    IOS学习笔记06---C语言函数 --------------------------------------------  qq交流群:创梦技术交流群:251572072              ...

  7. ios开发学习笔记001-C语言基础知识

    先来学习一下C语言基础知识,总结如下: 在xcode下编写代码. 1.编写代码 2.编译:cc –c 文件名.c 编译成功会生成一个 .o的目标文件 3.链接:把目标文件.o和系统自带的库合并在一起, ...

  8. C语言学习笔记 (007) - 数组指针和通过指针引用数组元素的方法总结

    1.数组指针:即指向数组的指针 那么, 如何声明一个数组指针呢? ]; /*括号是必须写的,不然就是指针数组:10是数组的大小*/ 拓展:有指针类型元素的数组称为指针数组. 2.通过指针引用数组元素的 ...

  9. C语言学习笔记--函数与指针

    1. 函数类型 (1)C 语言中的函数有自己特定的类型,这个类型由返回值.参数类型和参数个数共同决定.如 int add(int i,int j)的类型为 int(int,int). (2)C 语言中 ...

  10. C语言学习笔记 (001) - 常量指针与指针常量的区别(转帖)

    三个名词虽然非常绕嘴,不过说的非常准确.用中国话的语义分析就可以很方便地把三个概念区分开. 一) 常量指针. 常量是形容词,指针是名词,以指针为中心的一个偏正结构短语.这样看,常量指针本质是指针,常量 ...

随机推荐

  1. little's law(律特法则)

    参考:https://en.wikipedia.org/wiki/Little%27s_law(周末看一下) 最近在做性能压力测试,开始时,压力压不上去,参考: N = X * E[T] ,N就是你的 ...

  2. 【JavaScript】你知道吗?Web的26项基本概念和技术

    Web开发是比较费神的,需要掌握很多很多的东西,特别是从事前端开发的朋友,需要通十行才行.今天,本文向初学者介绍一些Web开发中的基本概念和用到的技术,从A到Z总共26项,每项对应一个概念或者技术. ...

  3. MySql 日期格式化函数date_format()

    mysql> select date_format(now(),'%Y'); +-------------------------+ | date_format(now(),'%Y') | +- ...

  4. JavaEE系列之(三)JDBC操作MySQL数据库

    一.JDBC简介        JDBC(Java Data Base Connectivity)java数据库连接        SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库 ...

  5. android安卓最新快捷环境搭建(转)

    现在很多视频和文章上的安卓环境搭建还是比较老的,挺麻烦.现在写快速方便的搭建: 一.下载JDK: 网址:http://www.oracle.com/technetwork/java/javase/do ...

  6. 自己编写的.sh脚本文件运行完闪退解决方案

    gnome-terminal设置如下图: 直接原因是,“命令退出时:退出终端”造成的!! 解决方案如下: 1. Ctrl + Alt + F1 ,进入文本操作模式: 2. 登录后,执行:yum ins ...

  7. 谈C#中的Delegate

    引言 Delegate是Dotnet1.0的时候已经存在的特性了,但由于在实际工作中一直没有机会使用Delegate这个特性,所以一直没有对它作整理.这两天,我再度翻阅了一些关于Delegate的资料 ...

  8. 一款基于jQuery多图切换焦点图插件

    这次要给大家分享的也是一款jQuery图片滑块插件,之前有介绍过不少实用的jQuery焦点图插件和jQuery图片滑块插件,比如jQuery左侧Tab切换的图片滑块插件.它的特点是可以同时切换多张图片 ...

  9. Emacs golang 配置

    在配置前需要下载用到的包: godoc godef gocode oracle 在下载包之前需要设置好环境变量: # Golang export GOROOT=$HOME/go export GOPA ...

  10. No saved view state could be found for the view identifier

    解决方法: javax.faces.application.ViewExpiredException:No saved view state could be found for the view i ...