循环char 指针_c 学习笔记 指针

1. 使用指针指向数组

int 

这种输入方式是错误的,因为数组名代表数组首元素的地址,是一个指针型常量,其值在程序运行期间是固定不变的。所以a++是无法实现的。

int a[10];
int *p = a;

for(i = 0;i<10;i++){
    scanf("%d", p++);
}


for(i = 0;i<10;i++){
    printf("%d",*p++);
}

上面这个代码块的输入部分是正确的,但是输入部分错了。因为在进行输出的时候,没有让p重新指向数组首地址。这样的话,在第二个for循环开始时,p的值为a+10。

因此应该在第二个for循环处添加代码

p = a;

另外由于++和*同优先级,因此

*p++;
*(p++);

这两个语句等价

2. 使用指针指向字符串

指针可以指向字符串的首地址

char 

其中p指针指向的是字符串“I live in China."的首个元素'I',其为字符变量,不是字符串变量。在第二行中,%s代表输出字符串,首先输出p所指向的首个元素'I',然后对p进行“+1”操作,让p指向字符串的第二个元素' ',如此循环下去,指导p指向的元素为字符串终止符'0'。需要注意的是,p不代表整个字符串,只是代表字符串的首地址。在输出字符串的时候,使用‘%s’表示输出整个字符串

同样的对于字符串数组

char str[]="I live in WuHan.";
printf("%sn",str);

其中数组名同样是一个指针,指向第字符串的第一个元素。

注意:c语言中是没有字符串变量的,但是我们在输出字符串时,可以通过'%s'和字符串的首地址来输出字符串。

3. 字符串数组的终止符'0'

int 

上面这个函数,乍一看好像没什么问题。但是需要注意的是,在for循环中,没有把a数组中的字符串终止符'0'赋值给b数组,这就导致了输出b数组时除了"I am a programmer."外,还会输出一些不知道什么字符,只有当b数组中出现'0'时(随机),才会终止输出

4. 指针的运算

int *p, *p1;
int array[10], num;
int max();

p = array;      //将数组array的首地址赋值给指针变量p
p = &array;     //将数组array的地址赋值给指针变量p
p = &array[0];  //将数组array的首地址赋值给指针变量p
p = &array[1];  //将数组array的第二个元素的地址赋值给指针变量p
p = p1;         //将指针变量p1的值赋值给指针变量p
p = &num;       //将num的地址赋值给指针变量p
p = max;        //将函数max的入口地址赋值给指针变量p
p++;            //将指针变量p加1,其值加上定义的*p的类型所占的字节数,这里*p的类型为int,则在p的值(所指向变量的地址)的基础上加4

需要注意的是,p = array与p = &array是不同的,虽然arry与&array的值相同,但是他们所代表的意义不同,一个是数组的首地址,一个是数组的地址。

int array[10];
printf("%d %d %d %d",array, &array, array+1,(&array+1));

运行结果分别是:

866906dfa721e34546b4e8e7a55a67c6.png

可见&array+1是在array[9]的地址的基础上加4(即int所占的4个字节)。

5. 指针和指针变量

int 

注意,指针变量是指变量p,而指针是指变量p所存储的地址本身。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值