Программирование - это просто
Advertisement
Главная
24.04.2024 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Microsoft visual c++ 2008. Урок 19. Указатели и выделение памяти. Печать E-mail
Автор megabax   
07.08.2012 г.
New Page 1

Microsoft visual c++ 2008. Урок 19. Указатели и выделение памяти.

Допустим, у нас есть массив char a[10]. В этом случае a - это указатель на первый элемент массива. С другой стороны, мы можем записать *p=&a[0]. Тогда у нас будет еще один указатель, и запись *p="abc" будет эквивалентна a[]="abc". Единственное, о чем следует помнить, так это то, что для записи данных в память, на которую указывает указатель, эта память должна быть выделена. Либо объявлен сам массив, либо вызвана функция malloc(). И длина записанных данных у нас не должна превышать размера выделенной памяти. Тоесть, если мы объявили char a[3], и присвоили *p=&a[0], то мы можем записать *p="abc". А вот записать *p="abcd" мы тоже можем, но делать это не нужно. С тчоки зрения компилятора это не будет ошибкой. Но, какие то данные в программ такой командой мы затерем. А потом у нас будут разные необычные глюки... Так что осторожней с указателями!

А теперь рассмотрим пример:

// les19.cpp: определяет точку входа для консольного приложения.

//

 

#include "stdafx.h"

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <string.h>

#include <malloc.h>

 

#define maxline 100

#define eof -1

 

//процедура ввода строки с клавиатуры

int getline(char s[], int lim)

{

       int c,i;

       for(i=0; i<lim-1 && (c=getchar()) != eof && c != '\n'; i++) s[i]=c;

       s[i]='\0';

       i++; //считаем количество

       return (i);

}

 

//копирование одного массива в другой

void strcpy1(char s[], char t[])

{

       int i=0;

       while ((s[i]=t[i]) != '\0') i++;

}

 

//копирование одного буфера в другой. В качестве аргументов

//используются указатели

void strcpy2(char *s, char *t)

{

       while ((*s=*t) != '\0')

       {

             s++;

             t++;

       }

}

 

 

//функция выделяет память по длине переданной строки и помещает туда эту строку.

//Возвращает указатель на выделенный буфер

char *strsave(char *s)

{

       char *p;

       int i=strlen(s)+1;

       p=(char *)malloc(i); //malloc возвращает void, поэтому надо преобразовать этот тип в char*.

       if((p!=NULL)) strcpy2(p,s); //копируем строку

       return (p);

}

 

int _tmain(int argc, _TCHAR* argv[])

{

       char s[maxline], t[maxline];

 

       //тестируем strcpy1

       printf("Enter string: ");

       getline(t,maxline); //с клавиатуры введем строку t

       strcpy1(s,t);

       printf("input string=%s\n",t);

       printf("out string=%s\n",s);

 

       //тестируем strcpy2

       printf("Enter string 2: ");

       getline(t,maxline); //с клавиатуры введем строку t

       strcpy2(&s[0],&t[0]);

       printf("input string=%s\n",t);

       printf("out string=%s\n",s);

 

       //тестируем strsave

       printf("Enter string 3: ");

       getline(s,maxline); //с клавиатуры введем строку s

       char *p=strsave(&s[0]);

       printf("saved string=%s\n",p);

       _getch();

 

       return 0;

}

А вот результат работы этой программы:

Microsoft visual c++ 2008. Урок 19. Указатели и выделение памяти.

 


Скриншоты, помеченные знаком *, являются цитатами и иллюстрациями   программного продукта "Microsoft Visual C++ Express Edition", авторское право на который принадлежит корпорации Microsoft.. 


 

Последнее обновление ( 16.11.2013 г. )
 
« След.   Пред. »
 
© 2024 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги