C语言


指针变量的定义

变量类型 *变量名;

#include <stdio.h>
int main()
{
// 指针就一个作用:能够根据一个地址值,访问对应的存储空间
// 指针变量p前面的int:指针变量p只能指向int类型的数据
int *p; // 定义了一个指针变量p
int a = 90;

p = &a; // 指针变量p指向了变量a 指针变量只能存储地址
    *p = 10;  //这里的*与定义指针变量时的*不同,它表示访问对应的存储空间
a = 20;

printf(
"%d\n", *p);

return 0;
}

指针相关

/*
%d int
%f float\double
%ld long
%lld long long
%c char
%s 字符串
%zd unsigned long
*/
#include
<stdio.h>
int main()
{
char *cp;
int *ap;
long *bp;

printf(
"cp=%zd, ap=%zd, bp=%zd\n",
sizeof(cp),
sizeof(ap),
sizeof(bp));
// 任何指针都占用8个字节的存储空间 64位编译器 思考下为什么指针要分类型 (计算机根据指针的类型来确认从内存中取多少个字节的内容)}

 

 

练习

//根据指针  在函数内部修改外部的变量
#include <stdio.h>
void change(int *p);
int main()
{
int a =10;
change(
&a);
printf(
"a=%d\n",a);
return 0;
}
void change(int *p)
{
*p = 20;
}

 

//利用指针让函数间接的有多个返回值 
#include <stdio.h>
int main()
{
int a = 15;
int b = 10;
int he=0,cha=0;
test(a,b,
&he,&cha);
printf(
"和是%d,差是%d",he,cha);
}
void test(int a,int b,int *c,int *d)
{
*c = a+b;
*d = a-b;
}

 指针与数组

#include <stdio.h>

/*
1.数组元素的访问方式
int ages[5];
int *p;
p = ages;
1> 数组名[下标] ages[i]
2> 指针变量名[下标] p[i]
3> *(p + i) //指针的+1并不是值加一

2.指针变量+1,地址值究竟加多少,取决于指针的类型
int * 4
char * 1
double * 8
*/
void change(int array[]);

int main()
{
// 20个字节
int ages[5] = {10, 11, 19, 78, 67};

change(ages);

return 0;
}

// 利用一个指针来接收一个数组,指针变量array指向了数组的首元素
void change(int *array)
{
printf(
"%d\n", array[2]);
//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 + 1);

int ages[5] = {10, 9, 8, 67, 56};

int *p;
// 指针变量p指向了数组的首元素
p = &ages[0];
// 数组名就是数组的地址,也是数组首元素的地址
//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[2]);

/*
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);
}

 指针与字符串

#include <stdio.h>

/*
1.常量区
存放一些常量字符串
2.堆
对象
3.栈
存放局部变量

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

//char name[] = "it";
//name[0] = 'T';
//printf("%s\n", name);
// "it" == 'i' + 't' + '\0'

2> 利用指针
char *name = "itcast"; // 字符串常量
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用,它被缓存起来,新定义指针是不在开内存空间的

// char *name2 = "it";
//char *name3 = "it";

//*name2 = 'T'; //程序会崩溃 它是常量不能修改

//printf("%c\n", *name2); // 指针变量name2指向了字符串的首字符

printf("%p\n%p\n", name2, name3); //不开新空间 地址相同

//printf("%s\n", name2); //直到遇到\0
*/

int main()
{
char name[20];

printf(
"请输入姓名:\n");

scanf(
"%s", name);

// 'j' 'a' 'c' 'k' '\0'

//printf("%c\n", name[3]);

//printf("刚才输入的字符串是:%s\n", name);

return 0;
}

// 定义字符串数组
void test2()
{
char *name = "jack";

//int ages[5];

// 指针数组(字符串数组)
char *names[5] = {"jack", "rose", "jake"};

// 二维字符数组(字符串数组)
char names2[2][10] = {"jack", "rose"};
}

 

本站声明
本文转载自:http://www.cnblogs.com/iedo/p/5045122.html     作者:呆而肥     发布日期:2015/12/14     本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。


 
© 2014-2017 ITdaan.com 粤ICP备14056181号