《IOS_C语言》指针
2015-08-29 19:53
357 查看
一:指针变量的定义和使用
(1)定义:int *p 指针变量为p,类型为" int * "整型指针,char */short*等都会有的,虽然有类型修饰符,但指针所占的字节由系统决定的,32位的系统占4字节,64位的占8字节
指针是存放内存地址的变量
printf("p=%p\n",p);//打印的是指针p的地址
(2)取址运算符&:
int a=3;
int *p=&a;
printf("&a=%p\n",&a);
printf("p=%p\n",p);
上面打印的两个地址都是一样的
(3)取值运算符*
int a=3,b=5;
int *p=&a;
printf("%d\n",*p);
p=&b;这里是指针的重新指向
*p=100;这里是通过指针来改变b的值
printf("%d\n",b);
(4)指针的算术运算
//指针的算术运算:指针的加法运算会有溢出,没意义,而减法就是两个地址的差值,即是内存空间。只有自增、自减和减法运算
int * p = &a;
!
p++; //向⾼位移动四个字节
!
p--; //向低位移动四个字节
课上代码验证
//打印出本电脑64位的一个指针的所占的字节数
int *p= NULL;
char *p= NULL;//即使是char型都一样是8字节,等于64位
printf("%lu\n",sizeof(p));
printf("%p\n",p);
p++;//往高位移动(int *p,int:四个字节,char *p,char:增加一个字节)
printf("%p\n",p);
p--;//往低位移动(int:四个字节,char:减少一个字节)
printf("%p\n",p);
int a=3,b=5;
int *p=&a;//指针一定赋值的是&地址
//指针变量p的类型修饰符是"int *",指针变量所占的字节数只与操作系统有关(int/char/short/float *p)也都是4或8字节(32位是4个,64位是8个字节)
//(1)取值符号*
printf("%d\n",*p);//这两种输出的值都一样
printf("%d\n",*(&a));
//(2)下面的取这两个地址值是一样的
printf("%p\n",p);//输出的地址都是ox7fff5fbff7dc地址
printf("%p\n",&a);
//(3)取地址符号&
//相对于上面*p=&a而言,下面是重新指向&b,则指针就会被后者覆盖掉
p=&b;//指针变量p把b的地址拿过来,并且b=5的值也会随之而拿过来,则输出的是地址,加上*就是取值了
printf("%d\n",*p);
//下面的两种方法达到相同的修改值的效果
// b=100;//直接方法
*p=100;//间接方法
//再次重新指向,指针变量p把100的值拿过来,则指针变量p拿过来的b地址的值就会等于100,则输出的b=100也是值
printf("%d\n",*p);
printf("%d\n",b);
二:指针与数组
数组名就是数组元素的首地址,因此
a[3]={1,3,4};
int*p=a;//这里指针指向数组的地址,也就是a[0]的地址
并且指针可以当数组名使用,因此有p[1]=a[1]=*(p+1)=*(a+1)
//如下:验证数组名就是指针,也就是数组首个元素的地址
int array[]={1,3,2,4};
printf("%p\n%p\n",array,&array[0]);
指针与数组的区别:
//指针变量可以重新指向,但是数组名不可以重新指向,因为他是常量指针,不可以重新指向,也不可以自增自减array++,从开始定义时他的地址就定下来常量,但可以array+1/-1;由于是整型的int则地址指向下一个地址array[1];
printf("%d\n",array[0]);//array[0]=1
printf("%d\n",array[1]);//array[1]=3
*(array+1)=100;
printf("%d\n",array[1]);//array[1]=100
//访问一个数组的元素的三种方法:
//(1)array[i]数组下标法 如printf("%c\n",string[1]);
//(2)*(array+i)数组移位法 printf("%c\n",*(string+1));
//(3)指针p[i]指针下标法 printf("%c\n",p[1]);
//(4)指针*(p+i)指针递增移位法 printf("%c\n",*(p+1));
char string[10] = {'i','P','h','o','n','e'};
//string
//为数组名,同时也是数组的⾸首地址。
char *p= string;
printf("%c\n",*p);//*p=string[0]
//*(p+1)=string[1]=p[1]=*(string+1)
printf("%c\n",*(p+1));//*(p+1)=string[1]
printf("%c\n",*(string+1));
printf("%c\n",p[1]);
printf("%c\n",string[1]);
short a[4] = {3 , 7 , 9 , 1};
//short占2个字节,则每个元素用16位来保存,并且从低位往上存起
int *p1 = a;
//int 占4个字节,读第一个元素也该是4个字节,也就是3和7的总32位二进制码的值,并且先读取7,再读取3的二进制码,则总的就是等于458755
char *p2 = a;
//char占一个字节,则只读取第一个字节的值恰好是00000011=3
printf("%d\n",*p1);
printf("%d\n",*p2)
三:指针与字符串
//指针与字符串
char string[] = "iPhone";//实际上是变成了string[]={'i','P','h','o','n','e','\0'}
//string为数组名
char *q="iPhone";
//q的地址跟"iPhone"地址一样,p与string的地址一样
char *p = string;
//指向字符数组⾸首地址string[0],但是输出的是整个字符串
// char *p = "iPhone";//不可以修改*(p+1) ='v';,不然会出错
//操作单个字符
*(p+1) ='v';//使得数组的string[1]重新=‘v’,原本的字符串并没有改,改的只是string[]里面复制版的值
//输出字符串的方式:printf("%s",指针名p/或者数组名string)
printf("%s\n",p);//输出为ivhone字符串
printf("%s\n",string);//输出为ivhone
// 通过指针计算字符串的长度(用到的知识点:)
//(1)array[i]数组下标法 如printf("%c\n",string[1]);
//(2)*(array+i)数组移位法printf("%c\n",*(string+1));
//(3)指针p[i]指针下标法 printf("%c\n",p[1]);
// (4)指针*(p+i)指针递增移位法printf("%c\n",*(p+1));
char *q="abk jdh";
int count=0;
while (*(q+count)!='\0') {
count++;
}
printf("%d\n",count);
四:指针数组
//指针数组
char *strings[3] = { "iOS", "Android", "Win8"};
//数组指针*(strings[3])=*strings[3]
//指针数组(*strings)[3]
for (int i=0; i<3; i++) {
printf("%s\n",strings[i]);
}
注意:可以⽤用指针修改字符数组,但不可修改常量字符串
五:指针与函数
指针作为参数,实现两个数的值交换的函数
//交换两个实参数,必须要用指针
//jiaohuan(&a,&b);//把地址(连带数值)传送进去
void jiaohuan(int*a,int*b)//传送指针,交换地址
{
int temp=*a;
*a=*b;
*b=temp;
}
int main(int argc, const char * argv[]) {
//交换两个数
int a=4;
int b=5;
jiaohuan(&a,&b);//把地址(连带数值)传送进去
printf("a=%d,b=%d\n",a,b);
}
(1)定义:int *p 指针变量为p,类型为" int * "整型指针,char */short*等都会有的,虽然有类型修饰符,但指针所占的字节由系统决定的,32位的系统占4字节,64位的占8字节
指针是存放内存地址的变量
printf("p=%p\n",p);//打印的是指针p的地址
(2)取址运算符&:
int a=3;
int *p=&a;
printf("&a=%p\n",&a);
printf("p=%p\n",p);
上面打印的两个地址都是一样的
(3)取值运算符*
int a=3,b=5;
int *p=&a;
printf("%d\n",*p);
p=&b;这里是指针的重新指向
*p=100;这里是通过指针来改变b的值
printf("%d\n",b);
(4)指针的算术运算
//指针的算术运算:指针的加法运算会有溢出,没意义,而减法就是两个地址的差值,即是内存空间。只有自增、自减和减法运算
int * p = &a;
!
p++; //向⾼位移动四个字节
!
p--; //向低位移动四个字节
课上代码验证
//打印出本电脑64位的一个指针的所占的字节数
int *p= NULL;
char *p= NULL;//即使是char型都一样是8字节,等于64位
printf("%lu\n",sizeof(p));
printf("%p\n",p);
p++;//往高位移动(int *p,int:四个字节,char *p,char:增加一个字节)
printf("%p\n",p);
p--;//往低位移动(int:四个字节,char:减少一个字节)
printf("%p\n",p);
int a=3,b=5;
int *p=&a;//指针一定赋值的是&地址
//指针变量p的类型修饰符是"int *",指针变量所占的字节数只与操作系统有关(int/char/short/float *p)也都是4或8字节(32位是4个,64位是8个字节)
//(1)取值符号*
printf("%d\n",*p);//这两种输出的值都一样
printf("%d\n",*(&a));
//(2)下面的取这两个地址值是一样的
printf("%p\n",p);//输出的地址都是ox7fff5fbff7dc地址
printf("%p\n",&a);
//(3)取地址符号&
//相对于上面*p=&a而言,下面是重新指向&b,则指针就会被后者覆盖掉
p=&b;//指针变量p把b的地址拿过来,并且b=5的值也会随之而拿过来,则输出的是地址,加上*就是取值了
printf("%d\n",*p);
//下面的两种方法达到相同的修改值的效果
// b=100;//直接方法
*p=100;//间接方法
//再次重新指向,指针变量p把100的值拿过来,则指针变量p拿过来的b地址的值就会等于100,则输出的b=100也是值
printf("%d\n",*p);
printf("%d\n",b);
二:指针与数组
数组名就是数组元素的首地址,因此
a[3]={1,3,4};
int*p=a;//这里指针指向数组的地址,也就是a[0]的地址
并且指针可以当数组名使用,因此有p[1]=a[1]=*(p+1)=*(a+1)
//如下:验证数组名就是指针,也就是数组首个元素的地址
int array[]={1,3,2,4};
printf("%p\n%p\n",array,&array[0]);
指针与数组的区别:
//指针变量可以重新指向,但是数组名不可以重新指向,因为他是常量指针,不可以重新指向,也不可以自增自减array++,从开始定义时他的地址就定下来常量,但可以array+1/-1;由于是整型的int则地址指向下一个地址array[1];
printf("%d\n",array[0]);//array[0]=1
printf("%d\n",array[1]);//array[1]=3
*(array+1)=100;
printf("%d\n",array[1]);//array[1]=100
//访问一个数组的元素的三种方法:
//(1)array[i]数组下标法 如printf("%c\n",string[1]);
//(2)*(array+i)数组移位法 printf("%c\n",*(string+1));
//(3)指针p[i]指针下标法 printf("%c\n",p[1]);
//(4)指针*(p+i)指针递增移位法 printf("%c\n",*(p+1));
char string[10] = {'i','P','h','o','n','e'};
//string
//为数组名,同时也是数组的⾸首地址。
char *p= string;
printf("%c\n",*p);//*p=string[0]
//*(p+1)=string[1]=p[1]=*(string+1)
printf("%c\n",*(p+1));//*(p+1)=string[1]
printf("%c\n",*(string+1));
printf("%c\n",p[1]);
printf("%c\n",string[1]);
short a[4] = {3 , 7 , 9 , 1};
//short占2个字节,则每个元素用16位来保存,并且从低位往上存起
int *p1 = a;
//int 占4个字节,读第一个元素也该是4个字节,也就是3和7的总32位二进制码的值,并且先读取7,再读取3的二进制码,则总的就是等于458755
char *p2 = a;
//char占一个字节,则只读取第一个字节的值恰好是00000011=3
printf("%d\n",*p1);
printf("%d\n",*p2)
三:指针与字符串
//指针与字符串
char string[] = "iPhone";//实际上是变成了string[]={'i','P','h','o','n','e','\0'}
//string为数组名
char *q="iPhone";
//q的地址跟"iPhone"地址一样,p与string的地址一样
char *p = string;
//指向字符数组⾸首地址string[0],但是输出的是整个字符串
// char *p = "iPhone";//不可以修改*(p+1) ='v';,不然会出错
//操作单个字符
*(p+1) ='v';//使得数组的string[1]重新=‘v’,原本的字符串并没有改,改的只是string[]里面复制版的值
//输出字符串的方式:printf("%s",指针名p/或者数组名string)
printf("%s\n",p);//输出为ivhone字符串
printf("%s\n",string);//输出为ivhone
// 通过指针计算字符串的长度(用到的知识点:)
//(1)array[i]数组下标法 如printf("%c\n",string[1]);
//(2)*(array+i)数组移位法printf("%c\n",*(string+1));
//(3)指针p[i]指针下标法 printf("%c\n",p[1]);
// (4)指针*(p+i)指针递增移位法printf("%c\n",*(p+1));
char *q="abk jdh";
int count=0;
while (*(q+count)!='\0') {
count++;
}
printf("%d\n",count);
四:指针数组
//指针数组
char *strings[3] = { "iOS", "Android", "Win8"};
//数组指针*(strings[3])=*strings[3]
//指针数组(*strings)[3]
for (int i=0; i<3; i++) {
printf("%s\n",strings[i]);
}
注意:可以⽤用指针修改字符数组,但不可修改常量字符串
五:指针与函数
指针作为参数,实现两个数的值交换的函数
//交换两个实参数,必须要用指针
//jiaohuan(&a,&b);//把地址(连带数值)传送进去
void jiaohuan(int*a,int*b)//传送指针,交换地址
{
int temp=*a;
*a=*b;
*b=temp;
}
int main(int argc, const char * argv[]) {
//交换两个数
int a=4;
int b=5;
jiaohuan(&a,&b);//把地址(连带数值)传送进去
printf("a=%d,b=%d\n",a,b);
}
相关文章推荐
- C++类的构造、拷贝构造、析构函数等
- C++ 指针与引用的区别 小结
- C++不能中断构造函数来拒绝产生对象(在构造和析构中抛出异常)
- 我的C++程序
- C++的运算符重载
- C中对于结构体成员的两种引用方式适用场合的区别
- 【C/C++】纯虚函数
- 【C/C++】多态的概念
- C++函数的返回值——返回引用类型&非引用类型
- 【C/C++】构造函数和析构函数
- 【C/C++】成员变量
- 【C/C++】类和结构
- C++中引用(&)的用法和应用实例===引用和多态的关系!!!!!!!!!!!!!!!!!
- 【C/C++】面向对象的基本概念
- 我的第一个C++程序
- 【C/C++】this指针
- DEV-C++
- 【C/C++】指针基本问题
- 【C/C++】运算符问题
- 作业《IOS_C语言》结构体、结构体数组